【问题标题】:How can I improve the rendering of JLabels?如何改进 JLabels 的呈现?
【发布时间】:2011-07-08 02:06:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “我正在尝试创建一个快速而肮脏的摇摆 UI”...还有其他类型的摇摆 UI 吗? :)
  • 好吧,还有那个缓慢、肥胖、汗流浃背且仍然很脏的 GridBagLayout :)。严肃地说,如果我正在用 Java 编写一个严肃的应用程序,我应该使用什么 UI?
  • 坦率地说,自 1.4 以来,挥杆已经有了很大的改进,特别是在 1.5 和 1.6 中。如果您正在开发桌面应用程序,那么无论如何您都没有太多选择。您拥有的其他 java 选项是 SWT 和 QT。我自己没用过QT,但是SWT还不错,但是你不会找到可能的SWT开发者来长期维护你的代码。

标签: java swing


【解决方案1】:
label.setMaximumSize( label.getPreferredSize() );

或者更好的是,重写 getMaximumSize() 方法以返回首选大小。

实际上,我收回了这个建议,因为标签的最大尺寸是首选尺寸。然而,这是一种适用于其他组件的技术,例如在使用 BoxLayout 时的 JTextField。

发布您的SSCCE 来证明问题。

编辑:

其实我觉得问题是BoxLayout在有多余空间的时候会尝试增加所有组件的高度。要解决这个问题,您需要使用:

panel.add( Box.createVerticalGlue() );

作为最后一个组件,以防止将额外空间分配给组件。

【讨论】:

  • @Sid Datia,下面的答案是什么意思?我在回复中给了你答案。事实上,您的问题是关于标签(而不是文本字段),所以我什至猜到您没有提出正确的问题。由于您没有发布代码,因此我提出了一些建议。其中一个有效。
  • 糟糕,我的主题标题不正确,对此感到抱歉。问题在于 JTextFields。我想在评论中发布代码等,但这不起作用。所以我用我写的代码发布了一个答案。该答案低于您的答案。我希望你能回顾一下我的所作所为并发表评论。
  • 我仍然没有在任何地方看到可接受的答案。你的代码所做的就是实现我的建议。
【解决方案2】:

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

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2021-03-23
    • 2022-09-16
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多