2008-09-24 105 views
8

我在写一个自定义文件选择组件。在我的用户界面中,首先用户点击一个按钮,弹出一个JFileChooser;当它关闭时,所选文件的绝对路径将被写入JTextFieldJava,Swing:如何设置JTextField的最大宽度?

问题是,绝对路径通常很长,导致文本字段放大,使其容器太宽。

我已经试过这一点,但什么也没做,文本字段仍然是太宽:

fileNameTextField.setMaximumSize(new java.awt.Dimension(450, 2147483647)); 

目前,当它是空的,它已经长400像素,由于GridBagConstraints附到它。

我希望它像HTML页面中的文本字段,它具有固定的大小,并且在输入过长时不会放大。

那么,如何设置JTextField的最大尺寸?

回答

12

它可能取决于您的文本字段所在的布局管理器。某些布局管理器扩展了一些布局管理器,有些布局管理器不支持。有些只在某些情况下扩展,有些则总是扩展。

我假设你正在做的

filedNameTextField = new JTextField(80); // 80 == columns 

如果是这样,最合理的布局,该字段应该不会改变大小(至少,它不应该增长)。布局经理在投入JScrollPane时经常表现不佳。

根据我的经验,试图通过setMaximumSizesetPreferredWidth等等来控制尺寸最好是不稳定的。 Swing自己和布局经理一起决定,你可以做些什么。

所有的说法,我没有遇到过的问题,这导致我相信一些明智地使用布局管理器可以解决问题。

3

我通过使用setMaximumSize设置文本字段容器的最大宽度来解决此问题。

根据davetron的回答,这是一个脆弱的解决方案,因为布局经理可能会忽视该属性。就我而言,容器是最顶级的,并且在第一次测试中起作用。

+0

是的,不幸的是,它与Swing的关系如何。在很多方面它都是一个很好的工具包,但不同布局管理器中组件的不可预测性实际上令人讨厌。 – davetron5000 2008-09-24 17:24:55

3

不要在文本字段上设置任何尺寸。而应通过setColumns将列大小设置为非零值,或使用带有列参数的构造函数。

正在发生的事情是JTextComponent在列为零时报告的首选大小是呈现文本所需的全部空间量。当列设置为非零值时,首选大小是显示许多标准列宽所需的大小。 (对于可变间距字体,它通常接近小写'm'的大小)。将列设置为零时,文本字段会请求尽可能多的空间,因为它可以获取并伸出整个容器。

由于您已经在GridBagLayout中使用了填充,因此您可以将列设置为1并让填充根据其他组件或其他适当的低数字来扩展它。

+1

我在使用FlowLayout的时候推荐这种方法。 – sworisbreathing 2011-11-18 23:20:59