GridBagLayout由于JLabel首选大小而导致列大小不等

时间:2015-01-23 23:06:53

标签: java swing layout-manager gridbaglayout

我有一个使用GridBagLayout作为布局的窗口。在左侧是一些JComboBox es,其中一些标签描述了它们是什么,在右侧是一些JPanel和一个 JLabel 给出描述相应JComboBox中所选项目的数量。两列的水平权重相等。但是,描述是JLabel(上面以粗体显示),虽然它的文本在<html>标签中以使其换行,但它设置其首选大小以使其整个长度适合一行,这使得它太宽了,列没有正确调整大小。

布局如下:

┌────────────────────┬────────────────────┐
│       JLabel       │                    │
├────────────────────┤                    │
│                    │ Description JPanel │
│     JComboBox      │                    │
│                    │                    │
├────────────────────┼────────────────────┤
│       JLabel       │                    │
├────────────────────┤                    │
│                    │ Description JPanel │
│     JComboBox      │                    │
│                    │                    │
├────────────────────┼────────────────────┤
│       JLabel       │                    │
├────────────────────┤    *Bothersome*    │
│                    │                    │
│     JComboBox      │      *JLabel*      │
│                    │                    │
├────────────────────┴────────────────────┤
│             JButton (Done)              │
└─────────────────────────────────────────┘

我想知道的是,如何使GridBagLayout忽略首选大小,或者如何使两列相等,而不管其中的组件?< / p>

提前致谢。

3 个答案:

答案 0 :(得分:1)

你可以做这样的事情:

JPanel mainPanel = new JPanel(new GridLayout(1,2));
mainPanel.add(leftPanel, BorderLayout.EAST);
mainPanel.add(rightPanel, BorderLayout.WEST);
mainPanel.add(buttonsPanel, BorderLayout.SOUTH);

leftPanelrightPanel包含您所描述的内容 在这种情况下,每一方都将获得50%的屏幕。

答案 1 :(得分:0)

GridBagLayout会尊重组件的首选大小,如果可用空间小于首选大小,它将使用最小大小......

您可以尝试为每列提供weightx 0.5,这将为每列分配剩余可用空间的50%

仔细查看How to Use GridBagLayout了解更多详情

您可以将布局拆分为两个部分,并为每列使用GridLayout,使用JPanelGridBagLayout作为行,但这样可以使行不对齐

另一种选择是使用MigLayout ....

之类的东西

答案 2 :(得分:0)

HTML的首选大小在Swing中是一条(非常宽)的行是正常的。是的,这令人沮丧。

假设label3list3分别是布局左侧的第三个JLabel和JComboBox,请尝试:

htmlLabel.setPreferredSize(
    new Dimension(htmlLabel.getMinimumSize().width,
                  label3.getPreferredSize().height +
                  list3.getPreferredSize().height));

您可能希望将label3和list3之间的GridBagLayout中使用的任何垂直插入添加到高度计算中。

另一种选择是在JScrollPane中使用不可编辑的JEditorPane,而不是JLabel。这将照顾包装,但让它看起来完全像JLabel可能是棘手的。在某些系统上设置字体,颜色和边框可能已足够,但在其他系统上则不够。