Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何改进JLabel的渲染?_Java_Swing - Fatal编程技术网

Java 如何改进JLabel的渲染?

Java 如何改进JLabel的渲染?,java,swing,Java,Swing,我试图创建一个快速而肮脏的swing UI。我的UI有两个JTextFields,然后在JScrollPane中有一个JTextArea,因为JTextArea的内容可能会变大 我使用的是一个简单的BoxLayout,我不想在GridBagLayout上浪费时间 我的问题是,当我调整窗口大小时,jlabel会变得很大。他们将有一行文字放在大量的空白处。它看起来很丑而且浪费。另一方面,JTextArea的大小永远不会增加,因为JScrollPane会处理额外的内容。因此,我将在滚动窗格中有巨大的J

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

我使用的是一个简单的BoxLayout,我不想在GridBagLayout上浪费时间

我的问题是,当我调整窗口大小时,jlabel会变得很大。他们将有一行文字放在大量的空白处。它看起来很丑而且浪费。另一方面,JTextArea的大小永远不会增加,因为JScrollPane会处理额外的内容。因此,我将在滚动窗格中有巨大的JTextFields和一个很小的JTextArea,几乎看不到一行

有没有一种简单的方法可以确保JTextFields的高度不会超过一行文字?可能会覆盖getMaximumSize/getPreferredSize?如果是,代码是什么

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

label.setMaximumSize( label.getPreferredSize() );
或者更好的方法是重写getMaximumSize()方法以返回首选大小

事实上,我接受这个建议,因为标签的最大尺寸是首选尺寸。但是,这是一种可以与其他组件一起使用的技术,例如在使用BoxLayout时使用JTextField

张贴你的文章,说明问题所在

编辑:

事实上,我认为问题在于当有额外的空间时,BoxLayout会增加所有组件的高度。要解决此问题,您需要使用:

panel.add( Box.createVerticalGlue() );
作为防止向组件分配额外空间的最后一个组件。

createVerticalGlue()没有任何作用。可能是我做错了

覆盖最大大小非常有效。为什么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);
    }

}

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

“我正在尝试创建一个快速而肮脏的swing UI”…是否还有其他类型的swing UI?:)嗯,有一种缓慢、肥胖、出汗且仍然肮脏的GridBagLayout:)。严肃地说,如果我正在用Java编写一个严肃的应用程序,我应该使用什么UI?坦白地说,swing自1.4以来已经有了很大的改进,特别是在1.5和1.6中。如果你正在开发桌面应用程序,你没有太多的选择。其他java选项是SWT和QT。我自己并没有用过QT,但SWT还可以,但您不会发现may SWT开发人员可以长期维护您的代码。@Sid Datia,下面的答案是什么意思?我在回答中给了你答案。事实上,你的问题是关于标签(而不是文本字段),所以我甚至猜你问的问题不恰当。因为你没有发布代码,我给了你一些建议。其中一个成功了。哎呀,我的主题标题不正确,很抱歉。问题在于JTextFields。我想在评论中发布代码等,但这不起作用。所以我用我写的代码发布了一个答案。这个答案低于你的答案。我希望你能回顾一下我所做的事情并对其进行评论。我仍然没有看到一个被接受的答案。你的代码所做的就是实现我的建议。