动态更改JDialog的宽度
我创建了一个包含JLabel的JDialog。 因为基于用户输入而改变的文本长度可以包含大量字符,所以需要根据JDialog的长度大小动态地改变JDialog的长度。 我尝试过pack()方法,但事实并非如此。 谁能给我一些提示? 提前致谢!
-
getPreferredSize
forJLabel
– 基本上你必须从JLabel
获取textLength
(以像素为单位),有3种正确的方法,但我喜欢:SwingUtilities.computeStringWidth(FontMetrics fm, String str)
-
现在你可以正确地为
JLabel
设置setPreferredSize
(请通过defalut将需要添加+5 – +10到返回SwingUtilities.computeStringWidth
的Integer
) - 呼叫
pack();
在顶级容器(JDialog
)上。
尝试在 我才意识到这不起作用。 JDialog
上调用validate()
。
这是一个讨论这个问题的好主题 。 我建议听听@Andrew Thompson提供的答案和建议,他实际上是一位杰出的用户。
另一种方法是将文本放入JTextArea
并将其放在JScrollPane
。
例如
码
import java.awt.*; import java.awt.event.*; import javax.swing.*; class ExpandingText { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { final String s = "The quick brown fox jumped over the lazy dog. "; final JTextArea textArea = new JTextArea(s,5,30); textArea.setWrapStyleWord(true); textArea.setLineWrap(true); textArea.setEditable(false); textArea.setFocusable(false); JButton button = new JButton("Add Text"); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae) { textArea.append(s); } }); JPanel panel = new JPanel(new BorderLayout(3,3)); panel.add(button, BorderLayout.NORTH); panel.add(new JScrollPane(textArea), BorderLayout.CENTER); JOptionPane.showMessageDialog(null, panel); } }); } }
为什么pack()
不适合你?
您可以使用setSize并将宽度基于JLabel
的宽度。 只要用户更改输入,就调用此方法。
尝试使用validate()
方法,这将导致JDialog
再次布局其子组件
编辑
这显然是行不通的