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
以便将我的 JLabel
和 JTextField
组件按垂直顺序排列。如果无法调整面板大小,我可以至少调整 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 已经解决了你的问题,我还需要说一些额外的建议:
不要扩展 JFrame
,JFrame
是一个刚性组件,而是围绕 JPanel
构建您的应用程序。参见:Using extends JFrame vs creating an instance of it
您没有将您的程序放在 Event Dispatch Thread (EDT) 这可以通过以下方式解决:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//Your constructor here
}
});
}
I mean vertical length
要指定 JTextField
的 height
,您可以重写其 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
:
这完全取决于您的需求。
不要忘记在 JFrame
[=62= 上调用 pack()
而不是 setPreferredSize()
或 setSize()
]
我有一个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
以便将我的 JLabel
和 JTextField
组件按垂直顺序排列。如果无法调整面板大小,我可以至少调整 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 已经解决了你的问题,我还需要说一些额外的建议:
不要扩展
JFrame
,JFrame
是一个刚性组件,而是围绕JPanel
构建您的应用程序。参见:Using extends JFrame vs creating an instance of it您没有将您的程序放在 Event Dispatch Thread (EDT) 这可以通过以下方式解决:
public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //Your constructor here } }); }
I mean vertical length
要指定
JTextField
的height
,您可以重写其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
:这完全取决于您的需求。
不要忘记在
[=62= 上调用JFrame
pack()
而不是setPreferredSize()
或setSize()
]