Java 如何改进JLabel的渲染?
我试图创建一个快速而肮脏的swing UI。我的UI有两个JTextFields,然后在JScrollPane中有一个JTextArea,因为JTextArea的内容可能会变大 我使用的是一个简单的BoxLayout,我不想在GridBagLayout上浪费时间 我的问题是,当我调整窗口大小时,jlabel会变得很大。他们将有一行文字放在大量的空白处。它看起来很丑而且浪费。另一方面,JTextArea的大小永远不会增加,因为JScrollPane会处理额外的内容。因此,我将在滚动窗格中有巨大的JTextFields和一个很小的JTextArea,几乎看不到一行 有没有一种简单的方法可以确保JTextFields的高度不会超过一行文字?可能会覆盖getMaximumSize/getPreferredSize?如果是,代码是什么 唯一能解决这种情况的函数是JFrame.pack(),但它会更改窗口大小(非常不受欢迎),有时也不会将自己限制在桌面上Java 如何改进JLabel的渲染?,java,swing,Java,Swing,我试图创建一个快速而肮脏的swing UI。我的UI有两个JTextFields,然后在JScrollPane中有一个JTextArea,因为JTextArea的内容可能会变大 我使用的是一个简单的BoxLayout,我不想在GridBagLayout上浪费时间 我的问题是,当我调整窗口大小时,jlabel会变得很大。他们将有一行文字放在大量的空白处。它看起来很丑而且浪费。另一方面,JTextArea的大小永远不会增加,因为JScrollPane会处理额外的内容。因此,我将在滚动窗格中有巨大的J
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。我想在评论中发布代码等,但这不起作用。所以我用我写的代码发布了一个答案。这个答案低于你的答案。我希望你能回顾一下我所做的事情并对其进行评论。我仍然没有看到一个被接受的答案。你的代码所做的就是实现我的建议。