Java,Swing:如何设置JTextField的最大宽度?
-
02-07-2019 - |
题
我正在编写自定义文件选择组件。在我的UI中,首先用户点击一个按钮,弹出 JFileChooser
;当它关闭时,所选文件的绝对路径将写入 JTextField
。
问题是,绝对路径通常很长,导致文本字段放大,使其容器太宽。
我试过这个,但它没有做任何事,文本字段仍然太宽:
fileNameTextField.setMaximumSize(new java.awt.Dimension(450, 2147483647));
目前,当它为空时,由于附加了 GridBagConstraints
,它已经是400px长。
我希望它像HTML页面中的文本字段一样,它具有固定的大小,并且在输入太长时不会放大。
那么,如何设置 JTextField
的最大大小?
解决方案
它可能取决于您的文本字段所在的布局管理器。某些布局管理器会扩展,而某些布局管理器则不会。有些只在某些情况下扩展,有些则总是扩展。
我假设你正在做
filedNameTextField = new JTextField(80); // 80 == columns
如果是这样,对于大多数合理的布局,字段不应改变大小(至少,它不应该增长)。布局管理器在放入 JScrollPane
时会表现得很糟糕。
根据我的经验,尝试通过 setMaximumSize
和 setPreferredWidth
等来控制大小是最不稳定的。 Swing自己决定使用布局管理器,你几乎无能为力。
所有这一切,我没有遇到你遇到的问题,这让我相信一些明智的布局管理器会解决这个问题。
其他提示
我通过使用 setMaximumSize
设置文本字段容器的最大宽度来解决这个问题。
根据davetron的回答,这是一个脆弱的解决方案,因为布局管理员可能会忽视该属性。就我而言,容器是最顶层的,并且在第一次测试中它起作用。
请勿在文本字段中设置任何尺寸。而是通过setColumns或使用带有column参数的构造函数将列大小设置为非零值。
当列为零时,JTextComponent报告的首选大小是呈现文本所需的全部空间量。当列设置为非零值时,首选大小是显示许多标准列宽的所需大小。 (对于可变间距字体,它通常接近小写字母“m”的大小)。将列设置为零后,文本字段将请求尽可能多的空间并扩展整个容器。
由于你已经在带有填充的GridBagLayout中使用了它,你可以将列设置为1并让填充根据其他组件或其他适当的低数量将其拉伸。