我有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
的大小以使其不占用整个空间?
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);
}
}
答案 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已经解决了你的问题,但我需要说一些额外的建议:
不要延伸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
}
});
}
我指的是垂直长度
要指定height
的{{1}},您可以覆盖其JTextField
方法,如下所示,这会使您的getPreferredSize()
高度为其原始值的两倍。< / p>
field1
这将使您的GUI看起来像这样:
或强>
设置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
:
这完全取决于您的需求。
请勿忘记在preferredSize
pack()
而不是setPreferredSize()
或setSize()
醇>