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

时间:2017-01-30 18:37:52

标签: java swing layout-manager 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的大小以使其不占用整个空间?

实施例

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);
    }
}

2 个答案:

答案 0 :(得分:6)

  

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

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

您可以通过控制最大尺寸来阻止文本字段增长:

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

答案 1 :(得分:3)

虽然@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.   

    我指的是垂直长度

    要指定height的{​​{1}},您可以覆盖其JTextField方法,如下所示,这会使您的getPreferredSize()高度为其原始值的两倍。< / p>

    field1

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

    enter image description here

    设置JTextField field1 = new JTextField(10) { @Override public Dimension getPreferredSize() { return new Dimension(super.getPreferredSize().width, super.getPreferredSize().height * 2); } }; 字体,如:

    field2

    然后会根据使用的字体使JTextField field2 = new JTextField(10); field2.setFont(new Font("Courier", Font.BOLD, 30)); 自动计算其field2

    enter image description here

    这完全取决于您的需求。

  4. 请勿忘记在preferredSize

  5. 上致电pack()而不是setPreferredSize()setSize()