我有一个使用GridBagLayout
作为布局的窗口。在左侧是一些JComboBox
es,其中一些标签描述了它们是什么,在右侧是一些JPanel
和一个 JLabel
给出描述相应JComboBox
中所选项目的数量。两列的水平权重相等。但是,描述是JLabel
(上面以粗体显示),虽然它的文本在<html>
标签中以使其换行,但它设置其首选大小以使其整个长度适合一行,这使得它太宽了,列没有正确调整大小。
布局如下:
┌────────────────────┬────────────────────┐
│ JLabel │ │
├────────────────────┤ │
│ │ Description JPanel │
│ JComboBox │ │
│ │ │
├────────────────────┼────────────────────┤
│ JLabel │ │
├────────────────────┤ │
│ │ Description JPanel │
│ JComboBox │ │
│ │ │
├────────────────────┼────────────────────┤
│ JLabel │ │
├────────────────────┤ *Bothersome* │
│ │ │
│ JComboBox │ *JLabel* │
│ │ │
├────────────────────┴────────────────────┤
│ JButton (Done) │
└─────────────────────────────────────────┘
我想知道的是,如何使GridBagLayout
忽略首选大小,或者如何使两列相等,而不管其中的组件?< / p>
提前致谢。
答案 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);
leftPanel
和rightPanel
包含您所描述的内容
在这种情况下,每一方都将获得50%的屏幕。
答案 1 :(得分:0)
GridBagLayout
会尊重组件的首选大小,如果可用空间小于首选大小,它将使用最小大小......
您可以尝试为每列提供weightx
0.5
,这将为每列分配剩余可用空间的50%
仔细查看How to Use GridBagLayout了解更多详情
您可以将布局拆分为两个部分,并为每列使用GridLayout
,使用JPanel
个GridBagLayout
作为行,但这样可以使行不对齐
另一种选择是使用MigLayout
....
答案 2 :(得分:0)
HTML的首选大小在Swing中是一条(非常宽)的行是正常的。是的,这令人沮丧。
假设label3
和list3
分别是布局左侧的第三个JLabel和JComboBox,请尝试:
htmlLabel.setPreferredSize(
new Dimension(htmlLabel.getMinimumSize().width,
label3.getPreferredSize().height +
list3.getPreferredSize().height));
您可能希望将label3和list3之间的GridBagLayout中使用的任何垂直插入添加到高度计算中。
另一种选择是在JScrollPane中使用不可编辑的JEditorPane,而不是JLabel。这将照顾包装,但让它看起来完全像JLabel可能是棘手的。在某些系统上设置字体,颜色和边框可能已足够,但在其他系统上则不够。