Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GridBagLayout列大小不相等,因为JLabel首选大小_Java_Swing_Layout Manager_Gridbaglayout - Fatal编程技术网

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可能是一个更好的解决方案,因为它更容易让多个容器排队,或者我被告知;)