【问题标题】:Java Swing JPanel Object Sizes all match JTextField sizeJava Swing JPanel 对象大小全部匹配 JTextField 大小
【发布时间】:2013-01-08 22:50:43
【问题描述】:

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

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; 调用了frame.pack() 方法来自动调整帧大小。如果我在不同区域(例如 WEST、CENTER、EAST)的 BorderLayout() 中创建单个对象,它们将按预期工作,但是当它们加载到面板中时,它们的大小都基于 JTextField(25)。任何想法为什么会这样?

【问题讨论】:

  • 这是 GridLayout 的行为。如果您想更好地控制 GUI 中每个组件的大小,则需要选择不同的 LayoutManager。要快速了解标准 LayoutManager 之间的差异,请查看here
  • @Code-Guru 你真的需要回答这个问题并添加一个例子!
  • 感谢链接代码大师,这对描述不同的布局类型很有帮助。

标签: java swing jpanel preferredsize


【解决方案1】:

正如 Code-Guru 和 asemax 指出的那样。您似乎正在使用GridLayout,它旨在利用可用空间在网格中均匀地布局组件。

尝试改用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"));
        }

    }

}

当您需要决定使用哪种布局时,您可能会发现 A Visual Guide to Layout Managers 有一些用处。

【讨论】:

  • 做到了。我想我需要花更多的时间来研究不同的布局。在创建工作程序的同时,我仍在尝试学习 java、swing 和 AWS API。计划是现在创建粗略的工作版本,然后在我学会如何正确编写相关程序后返回并优化/优化代码。啊,无需培训即可在工作中学习的乐趣...再次感谢您的帮助!
【解决方案2】:

引用 Java 的 documentation:

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

我的猜测是矩形大小是基于最大组件的首选大小。 您应该使用其他布局,也许 GridBagLayout 更适合您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多