【问题标题】:Align Swing Components across Panels跨面板对齐 Swing 组件
【发布时间】:2011-04-15 05:54:45
【问题描述】:

我们有一个 JPanel,其中包含多个 JPanel,其中包含 JComponents(比如说 JLabels 和 JTextboxes)

在每个内部 JPanel 中,我们使用 JGoodies Layout 来确保所有标签的正确对齐。

当然,我们希望所有标签在它们所在的子面板上独立对齐。

如果不固定包含 JLabels 的列的宽度,我们怎么能做到这一点?

我们不能松开 JPanel,因为我们必须在组件组周围设置边框。

【问题讨论】:

    标签: java swing layout alignment jgoodies


    【解决方案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 .. 这对面板对齐有何帮助?
      猜你喜欢
      • 2014-09-30
      • 2012-11-03
      • 1970-01-01
      • 2011-10-02
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      相关资源
      最近更新 更多