Java GridBagLayout列大小不相等,因为JLabel首选大小
我有一个使用Java GridBagLayout列大小不相等,因为JLabel首选大小,java,swing,layout-manager,gridbaglayout,Java,Swing,Layout Manager,Gridbaglayout,我有一个使用GridBagLayout作为布局的窗口。左侧是一些带有一些标签的JComboBoxe,描述它们是什么,右侧是一些JPanels和一个JLabel给出了相应JComboBox中所选项目的描述。两列在水平方向上的权重相等。但是,作为JLabel(上面的粗体)的描述,虽然其文本在标记中以使其包裹,但它将其首选大小设置为适合其在一行上的整个长度,这使得它太宽,并且列的大小不能正确调整 布局如下: ┌────────────────────┬────────────────────┐ │
GridBagLayout
作为布局的窗口。左侧是一些带有一些标签的JComboBox
e,描述它们是什么,右侧是一些JPanel
s和一个JLabel
给出了相应JComboBox
中所选项目的描述。两列在水平方向上的权重相等。但是,作为JLabel
(上面的粗体)的描述,虽然其文本在
标记中以使其包裹,但它将其首选大小设置为适合其在一行上的整个长度,这使得它太宽,并且列的大小不能正确调整
布局如下:
┌────────────────────┬────────────────────┐
│ JLabel │ │
├────────────────────┤ │
│ │ Description JPanel │
│ JComboBox │ │
│ │ │
├────────────────────┼────────────────────┤
│ JLabel │ │
├────────────────────┤ │
│ │ Description JPanel │
│ JComboBox │ │
│ │ │
├────────────────────┼────────────────────┤
│ JLabel │ │
├────────────────────┤ *Bothersome* │
│ │ │
│ JComboBox │ *JLabel* │
│ │ │
├────────────────────┴────────────────────┤
│ JButton (Done) │
└─────────────────────────────────────────┘
JPanel mainPanel = new JPanel(new GridLayout(1,2));
mainPanel.add(leftPanel, BorderLayout.EAST);
mainPanel.add(rightPanel, BorderLayout.WEST);
mainPanel.add(buttonsPanel, BorderLayout.SOUTH);
我想知道的是,如何使GridBagLayout
忽略首选大小,或者如何使两列相等,而不考虑其中的组件
提前感谢。您可以制作如下内容:
┌────────────────────┬────────────────────┐
│ JLabel │ │
├────────────────────┤ │
│ │ Description JPanel │
│ JComboBox │ │
│ │ │
├────────────────────┼────────────────────┤
│ JLabel │ │
├────────────────────┤ │
│ │ Description JPanel │
│ JComboBox │ │
│ │ │
├────────────────────┼────────────────────┤
│ JLabel │ │
├────────────────────┤ *Bothersome* │
│ │ │
│ JComboBox │ *JLabel* │
│ │ │
├────────────────────┴────────────────────┤
│ JButton (Done) │
└─────────────────────────────────────────┘
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%的屏幕。
GridBagLayout
将尽可能遵守组件的首选尺寸,如果可用空间小于首选尺寸,则将使用最小尺寸
您可以尝试为每列分配权重x
为0.5
,这将为每列分配50%的剩余可用空间
请仔细查看以了解更多详细信息
您可以将布局拆分为两个部分,并对每列使用GridLayout
,对行使用单独的JPanel
s和gridbagloayout
,但这将允许行不对齐
另一种选择是使用类似于
MigLayout
…的东西,HTML的首选大小通常是Swing中的一行(非常宽)。是的,这是令人沮丧的
假设label3
和list3
分别是布局左侧的第三个JLabel和JComboBox,请尝试以下操作:
htmlLabel.setPreferredSize(
new Dimension(htmlLabel.getMinimumSize().width,
label3.getPreferredSize().height +
list3.getPreferredSize().height));
您可能需要将GridBagLayout中使用的label3和list3之间的任何垂直插入添加到高度计算中
另一种选择是在JScrollPane中使用不可编辑的JEditorPane,而不是JLabel。这将考虑包装,但要让它看起来像一个JLabel可能很棘手。在某些系统上设置字体、颜色和边框可能是不够的,但在其他方面不够。是否考虑使用GaldBar约束?这不会使列宽度相等;它只会给它们提供等量的额外空间;在GridBagLayout中,每个轴的权重都是相对的。我原则上同意应该避免设置PreferredSize。在这种情况下,我不知道还有其他方法,当然除了生成JLabel的子类以覆盖getPreferredSize(),这似乎没有任何好处,除非HTML标签的文本在创建后会发生更改。虽然我没有这方面的经验,我怀疑MigLayout可能是一个更好的解决方案,因为它更容易让多个容器排队,或者我被告知;)