【问题标题】:Can a layout manager spawn several JPanels?布局管理器可以生成多个 JPanel 吗?
【发布时间】:2024-01-20 22:56:02
【问题描述】:

我必须构建一个包含许多控件的相当大的表单。控件分为基本控件/设置和扩展控件/设置。用户可以决定是只查看基本控件还是同时查看基本控件和扩展控件。

我已将所有扩展控件放到它们自己的 JPanel 上,这样我就可以通过显示或隐藏此面板轻松地在两个视图之间切换。

目前我正在使用 GroupLayout,发生的情况是不同面板上的控件未对齐:

Label aaa:     Text field
Label a:       Text field
Label aaaaaa:  Text field
----------------------------
Label b:    Text field
Label bbb:  Text field
Label bb:   Text field

不幸的是,我现在找到了“同步”两个面板布局的方法(使用 AbsoluteLayout 和固定控制坐标除外)

  • 有什么方法可以实现吗?
  • 我的整个设计有缺陷吗?

编辑:如果可能的话,我想保留 GroupLayout 管理器。

【问题讨论】:

    标签: java swing netbeans netbeans6.5 layout-manager


    【解决方案1】:

    据我所知,没有任何 Swing LayoutManager(来自 JRE 或开源)可以跨越多个面板。

    我目前正在为我的DesignGridLayout 项目开发这样一个功能(我称之为“布局同步”),但实现起来并不容易(我大约 2 周前就开始了,但我仍然没有看到确切地说,我是否以及何时会得到一些有趣的东西,但我仍然对它寄予厚望;-))

    您可以检查的一个选项是将所有组件添加到同一个面板(然后只有一个 GroupLayout)并根据用户的选择隐藏/显示它们。希望 GroupLayout 能够根据情况调整大小(在调用 pack() 之后)。

    如果 GroupLayout 表现良好,那么每次用户更改选择以显示/隐藏扩展字段后,只需调用 pack() 即可。

    否则,每次用户更改其选择时,您都必须手动设置面板的大小。

    【讨论】:

      【解决方案2】:

      可能最简单(好的)方法是将所有组件添加到主面板。将子面板设置为不透明,并将其也添加到主面板。需要关闭优化绘图的主面板。

      另一种技术是添加间隔组件。在底部面板中添加一个与标签在同一列中的组件,该组件动态地从顶部标签中获取其各种尺寸方法的宽度组件。对顶部面板执行相同操作。

      【讨论】:

        【解决方案3】:

        我认为使用标准布局管理器无法做到这一点。您可能必须编写自己的布局管理器,但如果您将 GroupLayout 子类化,这应该不会太难。

        【讨论】:

          【解决方案4】:

          您可以使用 GridLayout 而不是 GroupLayout,这将使您在列之间获得统一的间距

          【讨论】:

            【解决方案5】:

            如果您想将它们保存在具有单独布局的单独面板中:

            遍历您添加的所有标签,并找到每个标签的最大首选宽度。 第二次迭代,并将首选大小设置为每个标签的首选高度,但最大宽度。

            【讨论】:

              【解决方案6】:

              这是GridLayout的解释。这会将每个组件设置为您期望的大小。使用 GridData 对象,您可以指定组件的排序方式。

              Examples


              (来源:sun.com

              【讨论】: