跨面板对齐 Swing 组件
Posted
技术标签:
【中文标题】跨面板对齐 Swing 组件【英文标题】:Align Swing Components across Panels 【发布时间】:2011-04-15 05:54:45 【问题描述】:我们有一个 JPanel,其中包含多个 JPanel,其中包含 JComponents(比如说 JLabels 和 JTextboxes)
在每个内部 JPanel 中,我们使用 JGoodies Layout 来确保所有标签的正确对齐。
当然,我们希望所有标签在它们所在的子面板上独立对齐。
如果不固定包含 JLabels 的列的宽度,我们怎么能做到这一点?
我们不能松开 JPanel,因为我们必须在组件组周围设置边框。
【问题讨论】:
【参考方案1】:据我所知,没有简单的方法可以做到这一点。您的选择:
使用该功能编写您自己的布局管理器(或扩展现有的) 固定列宽 决定在视觉上由边框分隔的面板不需要对齐其内容【讨论】:
+1。我同意迈克尔的观点,鉴于其复杂性,您必须坐下来设计布局。 我自己试过了,非常困难。据我所知,主要问题是调用 2 个(或更多)面板布局方法中的哪一个的顺序,甚至是一个可能被调用但另一个不能被调用的事实...... 我宁愿建议只使用一个面板并使用一些“构建器类”向其中添加组件,这样您就可以为多种“组件组”重复使用构建器。 【参考方案2】:仅仅因为JPanel
s 有边框,并不意味着它们实际上需要包含其明显的内容。将面板设置为透明。将面板和组件添加到封闭面板。添加间隔组件以模仿布局中面板的插图。对于重叠的组件,您还需要关闭“优化绘图”或类似功能。
【讨论】:
嗯,这可能行得通 - 但我怀疑当边框与它们应该包围的组件不匹配时,它会在各种极端情况下导致很多麻烦。跨度> @Michael 你是什么意思?为我工作!【参考方案3】:如果对齐小部件是您的首要任务,我已阅读有关使用 JSeparator 而不是多个带边框的 JPanel 的建议。
JSeparator 提供了对小部件进行分组的视觉效果,但它们本身只是适合同一 JPanel 的另一个简单小部件。阅读教程以获取重要提示,例如设置首选尺寸。 http://download.oracle.com/javase/tutorial/uiswing/components/separator.html
此外,Apple 的当前指南建议仅使用空白作为分组之间的分隔符,以替代边框和分隔符。
【讨论】:
【参考方案4】:我建议优先使用平面布局而不是嵌套布局。在单一布局中对齐很容易。避免使用 TitledBorders 并将它们替换为带标题的分隔符、分隔符或只是空格。这对绝大多数编辑器和表单都有帮助。
但是,如果您想跨多个编辑器或表单对齐,则上述技术会失败。 JGoodies FormLayout 提供了两个级别来解决这个问题,更普遍地是为了提高布局的一致性:1)大小的下限,2)布局变量。
使用 1),您可以描述确保跨表单的最小宽度的布局。例如,如果要说所有标签列的宽度至少为 100px,则可以为标签列说“[100px, pref]”。
2) 超越了方法 1)。动机是从你的许多表单中提取 100px。在 FormLayout 中,您可以设置布局变量,例如 $label 配置为“[100px, pref]”或“right:[75dlu, pref]”等。如果您在所有编辑器中使用布局变量,这些将是一致,您可以在一个地方为所有编辑器配置所有标签列。
【讨论】:
嗨 Karsten,我同意平面布局,但(当时)需要有组:-/ 我不知道布局变量。很高兴知道。 听起来不错,但是如何在 Swing 中制作标题分隔符?JSeparator
可以制作一个无标题的,垂直的或水平的。【参考方案5】:
此示例代码可以帮助解决您的对齐问题:
//c is instance of the content pane
c.setLayout(gl=new GridLayout(3,0));
//jp is a jpanel. I took this panel because there is no alignment
//setting for a specifiq cell of grid Layout.
jp.setAlignmentX(CENTER_ALIGNMENT);
//jl is the jLabel
jp.add(jl);
//finally I add that with the frame
c.add(jp);
希望它能帮助您解决问题。
【讨论】:
ehh .. 这对跨面板对齐有何帮助?以上是关于跨面板对齐 Swing 组件的主要内容,如果未能解决你的问题,请参考以下文章
Java 每次把一个Swing组件放在一个JPanel中时,总是放在左边,有啥办法让其放在面板中间?
JavaSE基础(十 二 )---<GUI>GUI概述,Swing,容器组件,窗口,面板,布局管理器