如何改进JLabels的渲染?

时间:2011-07-08 02:06:48

标签: java swing

我正在尝试创建一个快速而肮脏的swing UI。我的UI有几个JTextField,然后是JScrollPane中的JTextArea,因为JTextArea的内容可能会变大。

我使用的是简单的BoxLayout,我不想浪费时间使用GridBagLayout。

我的问题是,当我调整窗口大小时,JLabels变得庞大。他们将在一大堆空白区域中放置一行文本。它看起来很丑陋,很浪费。另一方面,JTextArea的大小永远不会增加,因为JScrollPane负责额外的内容。所以我会在滚动窗格中有大量的JTextField和一个小的JTextArea,只有一行可见。

有没有一种简单的方法可以确保JTextFields的高度永远不会超过一行文本?也许重写getMaximumSize / getPreferredSize?如果是这样,那么代码是什么?

解决这种情况的唯一功能是JFrame.pack(),但它会改变窗口大小(非常不受欢迎),有时候也不会将自己限制在桌面上。

2 个答案:

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

}

请原谅我糟糕的编码标准。