java - GridBagLayout:最后一个组件影响网格宽度

标签 java swing grid width gridbaglayout

我遇到了 Javas GridBagLayout 的问题。

运行以下代码:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Main extends JFrame{

    public static void main (String [] args){
        new Main(); 
    }

    public Main(){
        add(getPanel());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setSize(600, 150);
    }

    private JPanel getPanel(){
        JPanel panel = new JPanel(new GridBagLayout());

        JLabel label1 = new JLabel("Label 1");
        JLabel label2 = new JLabel("Label 2");
        JLabel label3 = new JLabel("Label 3");

        JTextField area1 = new JTextField();
        JTextField area2 = new JTextField();

        JComboBox<String> box = new JComboBox<String>();
        box.addItem("One One One");
        box.addItem("Two Two Two");

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets = new Insets(10, 10, 10, 10);

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0;
        panel.add(label1, gbc);

        gbc.gridx = 1;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        panel.add(area1, gbc);

        gbc.gridx = 2;
        gbc.weightx = 0;
        gbc.fill = GridBagConstraints.NONE;
        panel.add(label2, gbc);

        gbc.gridx = 3;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        panel.add(area2, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.NONE;
        gbc.weightx = 0;
        panel.add(label3, gbc);

        gbc.weightx = 1;
        gbc.gridx = 1;
        panel.add(box, gbc);

        return panel;
    }
}

产生以下窗口:

Problem with GridBagLayout Screenshot

但是两个 JTextField 的宽度应该相同。

如果我不添加 JComboBox 一切都很好:

enter image description here

我的问题是:为什么最后一个组件会影响前面组件的网格宽度?对我来说真正奇怪的是,如果 JComboBox 长度增加,右侧的 JTextField 会变小。实际上,看起来左侧 JTextField 的长度等于右侧 JTextField 的长度 + JComboBox 的长度。 在下一行中有两个长度相等的文本字段 JComboBox 的技巧是什么?

提前致谢!

最佳答案

根据GridBagLayout informations :

Essentially, GridBagLayout places components in rectangles (cells) in a grid, and then uses the components' preferred sizes to determine how big the cells should be.

由于当您添加 JComboBox 时,它的首选大小大于您的 JTextField,因此 x=1 处的网格将占据较大比例的位置JPanel 因为相等的 weightx 会根据自己喜欢的大小共享所需的位置..

这就是为什么添加JComboBox“插入”gridx=2。为了避免这种情况,您可以在创建 JTextField 时决定它们的列数:

JTextField area1 = new JTextField(15);
JTextField area2 = new JTextField(15);

或添加占位符文本,使 JTextField 的首选大小大于 0。 如果你要做

box.setPreferredSize(area1.getPreferredSize());
panel.add(box, gbc);

您会注意到 JComboBox 几乎不可见,因为首选尺寸很小,而另一方面,这将使您的面板每一侧都相等。

我还建议您为每个组件使用新的 GridBagConstraints ,以避免复制之前添加的组件的值(您未重置值)。

关于java - GridBagLayout:最后一个组件影响网格宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662372/

相关文章:

java - libGDX:尝试实现 AdMob 但无法使其工作

java - 在单个线程锁中将多个字符串插入带有 TitledBorder 的 JTextPane 会导致程序锁定

java - 如何更好地实现 5x5 按钮网格拼图的实现,以使用 2D 数组激活网格上周围的按钮?

javascript - dhtmlx 网格只读复选框

c - 实现几何中位数

java - 如何在 Eclipse 中查看 Spock 测试的代码覆盖率

java - 将表或项目列表添加到 SQLite

java - 在 java switch 表达式中使用 kotlin 常量

Java - 使用存储在数组中的文本更改 JLabel

java - 为什么我会收到 InvalidDnDOOperationException?