JPanel 在使用 BoxLayout 时不会调整大小

JPanel won't resize when using BoxLayout

我有一个JPanel,设置如下:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

然后我添加一个JTextField,它占据了整个面板:

JTextField field = new JTextField();
panel.add(field);

但是,当我尝试调整它的大小时:

panel.setPreferredSize(new Dimension(20,400));

没有任何反应。为什么?我正在使用 BoxLayout 以便将我的 JLabelJTextField 组件按垂直顺序排列。如果无法调整面板大小,我可以至少调整 JTextField 的大小,使其不会占用整个 space 吗?

示例:

import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GUI extends JFrame 
{
    public GUI() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
        panel.setPreferredSize(new Dimension(20,400));
        JTextField field1 = new JTextField();
        JTextField field2 = new JTextField();
        panel.add(field1);
        panel.add(field2);
    }
}

can I at least resize the JTextField so it does not take up the entire space?

BoxLayout 将调整组件的大小以填充面板中的 space 直到组件的最大尺寸。文本字段没有最大大小。

您可以通过控制最大大小来防止文本字段变大:

panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
JTextField textField = new JTextField(10);
textField.setMaximumSize( textField.getPreferredSize() );
panel.add( textField );

虽然@camickr 已经解决了你的问题,我还需要说一些额外的建议:

  1. 不要扩展 JFrameJFrame 是一个刚性组件,而是围绕 JPanel 构建您的应用程序。参见:Using extends JFrame vs creating an instance of it

  2. 您没有将您的程序放在 Event Dispatch Thread (EDT) 这可以通过以下方式解决:

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                //Your constructor here
            }
        });
    }
    
  3. I mean vertical length

    要指定 JTextFieldheight,您可以重写其 getPreferredSize() 方法,如下所示,这会为您的 field1 提供其原始值两倍的高度.

    JTextField field1 = new JTextField(10) {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(super.getPreferredSize().width, super.getPreferredSize().height * 2);
        }
    };
    

    这将使您的 GUI 看起来像这样:

    field2 字体设置为:

    JTextField field2 = new JTextField(10);
    field2.setFont(new Font("Courier", Font.BOLD, 30));
    

    这将使您的 field2 根据使用的字体自动计算其 preferredSize:

    这完全取决于您的需求。

  4. 不要忘记在 JFrame

    [=62= 上调用 pack() 而不是 setPreferredSize()setSize() ]