我正在尝试创建一个快速而肮脏的swing UI。我的UI有几个JTextField,然后是JScrollPane中的JTextArea,因为JTextArea的内容可能会变大。
我使用的是简单的BoxLayout,我不想浪费时间使用GridBagLayout。
我的问题是,当我调整窗口大小时,JLabels变得庞大。他们将在一大堆空白区域中放置一行文本。它看起来很丑陋,很浪费。另一方面,JTextArea的大小永远不会增加,因为JScrollPane负责额外的内容。所以我会在滚动窗格中有大量的JTextField和一个小的JTextArea,只有一行可见。
有没有一种简单的方法可以确保JTextFields的高度永远不会超过一行文本?也许重写getMaximumSize / getPreferredSize?如果是这样,那么代码是什么?
解决这种情况的唯一功能是JFrame.pack(),但它会改变窗口大小(非常不受欢迎),有时候也不会将自己限制在桌面上。
答案 0 :(得分:2)
label.setMaximumSize( label.getPreferredSize() );
或者更好的是,覆盖getMaximumSize()方法以返回首选大小。
实际上,我接受了这个建议,因为标签的最大尺寸是首选尺寸。但是,这是一种可以与其他组件一起使用的技术,例如JTextField,例如在使用BoxLayout时。
发布展示问题的SSCCE。
编辑:
实际上我认为问题是BoxLayout尝试会在有额外空间时增加所有组件的高度。要解决此问题,您需要使用:
panel.add( Box.createVerticalGlue() );
作为防止额外空间分配给组件的最后一个组件。
答案 1 :(得分:0)
createVerticalGlue()不执行任何操作O_O。也许我做错了。
覆盖最大尺寸非常有效。为什么Java默认不做呢???
public class TextFTest {
/**
* @param args
*/
public static void main(String[] args) {
JFrame jf = new JFrame();
class X extends JTextField {
public X(String text) {
super(text);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(super.getMaximumSize().width,
getPreferredSize().height);
}
}
jf.getContentPane().setLayout(
new BoxLayout(jf.getContentPane(), BoxLayout.Y_AXIS));
X f = new X("Hello");
jf.getContentPane().add(f);
JTextField f1 = new JTextField("Hello1");
jf.getContentPane().add(f1);
jf.getContentPane().add(Box.createVerticalGlue());
jf.validate();
jf.setSize(300, 300);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
}
请原谅我糟糕的编码标准。