跨面板对齐 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】:

仅仅因为JPanels 有边框,并不意味着它们实际上需要包含其明显的内容。将面板设置为透明。将面板和组件添加到封闭面板。添加间隔组件以模仿布局中面板的插图。对于重叠的组件,您还需要关闭“优化绘图”或类似功能。

【讨论】:

嗯,这可能行得通 - 但我怀疑当边框与它们应该包围的组件不匹配时,它会在各种极端情况下导致很多麻烦。跨度> @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 AWT / Swing垂直对齐面板

Java 每次把一个Swing组件放在一个JPanel中时,总是放在左边,有啥办法让其放在面板中间?

JavaSE基础(十 二 )---<GUI>GUI概述,Swing,容器组件,窗口,面板,布局管理器

《Java Swing》第3节:布局管理器

java swing问题:JFrame根面板不透明且可见,内容面板不透明且可见,层面板透明且可见,

如何使用 Swing 在 JFrame 中添加面板