Java Swing JPanel对象大小都与JTextField大小匹配

Java Swing JPanel对象大小都与JTextField大小匹配,java,swing,jpanel,preferredsize,Java,Swing,Jpanel,Preferredsize,我遇到了一个不寻常的问题,一个JPanel中的所有对象都有JTextField的大小。即使我尝试在其他对象上强制设置一个大小,它们仍然将为textfield指定的大小作为自己的大小。例如,我正在尝试使用自己的方法设置单个面板,如下所示: private JPanel setupID() { JLabel projLbl = new JLabel("Project ID:"); JButton verifyBtn = new JButton("Verify ID"); pr

我遇到了一个不寻常的问题,一个JPanel中的所有对象都有JTextField的大小。即使我尝试在其他对象上强制设置一个大小,它们仍然将为textfield指定的大小作为自己的大小。例如,我正在尝试使用自己的方法设置单个面板,如下所示:

private JPanel setupID() {
    JLabel projLbl = new JLabel("Project ID:");
    JButton verifyBtn = new JButton("Verify ID");
    projID = new JTextField(25);
    verifyBtn.setToolTipText("Verifies that the entered ID is not already in use.");
    JPanel theID = new JPanel(new GridLayout(1,0));
        theID.add(projLbl);
        theID.add(projID);
        theID.add(verifyBtn);
    return theID;
}
我最后看到的是一扇像这样的窗户。。。
JFrame调用了
frame.pack()
方法来自动调整帧大小。如果我在不同区域(例如西部、中部、东部)的
BorderLayout()
中创建单个对象,它们将按预期工作,但当它们加载到面板中时,它们的大小都基于
JTextField(25)
。你知道为什么吗?

引用Java的:

GridLayout类是一个布局管理器,用于在矩形网格中布局容器的组件。容器被划分为大小相等的矩形,每个矩形中放置一个组件[…]

我猜矩形的大小是基于最大组件的首选大小。 您应该使用另一种布局,也许a更适合您的需要。

引用Java的:

GridLayout类是一个布局管理器,用于在矩形网格中布局容器的组件。容器被划分为大小相等的矩形,每个矩形中放置一个组件[…]

我猜矩形的大小是基于最大组件的首选大小。
您应该使用另一种布局,也许a更适合您的需要。

正如代码专家和asemax所指出的那样。看起来您使用的是
网格布局
,该布局旨在使用可用空间均匀地在网格中布局组件

尝试使用类似于
GridBagLayout
的东西来代替

public class BadLayout08 {

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

    public BadLayout08() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            add(new JLabel("Project ID:"));
            add(new JTextField(25));
            add(new JButton("Verify ID"));
        }

    }

}


当您需要决定使用哪种布局时,您可能会发现它有一些用处。

正如代码大师和asemax所指出的那样。看起来您使用的是
网格布局
,该布局旨在使用可用空间均匀地在网格中布局组件

尝试使用类似于
GridBagLayout
的东西来代替

public class BadLayout08 {

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

    public BadLayout08() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            add(new JLabel("Project ID:"));
            add(new JTextField(25));
            add(new JButton("Verify ID"));
        }

    }

}


当您需要决定使用哪种布局时,您可能会发现它有一些用处。

这是GridLayout的行为。如果希望对GUI中每个组件的大小有更多的控制,则需要选择不同的LayoutManager。要快速查看标准布局管理器之间的差异,请选中。@Code Guru您需要认真回答这个问题并添加一个示例!感谢链接代码大师,这对描述不同的布局类型很有帮助。这就是GridLayout的行为。如果希望对GUI中每个组件的大小有更多的控制,则需要选择不同的LayoutManager。要快速查看标准布局管理器之间的差异,请选中。@Code Guru您需要认真回答这个问题并添加一个示例!感谢链接代码大师,这对描述不同的布局类型很有帮助。做到了。我想我需要多花点时间看看不同的布局。我仍然在努力学习java、swing和AWSAPI,同时为工作创建程序。计划是现在就创建粗糙的、有效的版本,然后在我学会如何正确编写有问题的程序后,返回并细化/优化代码。啊,在工作中学习而不接受培训的乐趣。。。再次感谢你的帮助!成功了。我想我需要多花点时间看看不同的布局。我仍然在努力学习java、swing和AWSAPI,同时为工作创建程序。计划是现在就创建粗糙的、有效的版本,然后在我学会如何正确编写有问题的程序后,返回并细化/优化代码。啊,在工作中学习而不接受培训的乐趣。。。再次感谢你的帮助!