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

Pla*_*win 0 java swing layout-manager boxlayout

我有一个JPanel并设置如下:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
Run Code Online (Sandbox Code Playgroud)

然后我添加一个JTextField占用整个面板的:

JTextField field = new JTextField();
panel.add(field);
Run Code Online (Sandbox Code Playgroud)

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

panel.setPreferredSize(new Dimension(20,400));
Run Code Online (Sandbox Code Playgroud)

什么都没发生.为什么?我正在使用BoxLayout以便将我JLabelJTextField组件按垂直顺序排列.如果无法调整面板的大小,我是否可以至少调整大小JTextField以使其不占用整个空间?

例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

cam*_*ckr 6

我可以至少调整JTextField的大小,以免占用整个空间吗?

BoxLayout将调整组件的大小以填充面板中的空间,直到组件的最大大小.文本字段没有最大大小.

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

panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
JTextField textField = new JTextField(10);
textField.setMaximumSize( textField.getPreferredSize() );
panel.add( textField );
Run Code Online (Sandbox Code Playgroud)

  • 无需控制高度.根据文本字段的字体给出文本字段的首选大小.不要试图微观管理组件的大小.如果想要更大的文本,可以更改"字体",但必须在更改最大尺寸之前执行此操作.如果你想在文本及其边框周围留出额外的空间,那么你需要使用自定义的`Border`.阅读[如何使用边框]上的Swing教程(http://docs.oracle.com/javase/tutorial/uiswing/components/border.html).你需要一个`CompoundBorder`,包含一个`LineBorder`和一个`EmptyBorder`. (2认同)