动态更改JDialog的宽度

我创建了一个包含JLabel的JDialog。 因为基于用户输入而改变的文本长度可以包含大量字符,所以需要根据JDialog的长度大小动态地改变JDialog的长度。 我尝试过pack()方法,但事实并非如此。 谁能给我一些提示? 提前致谢!

  1. getPreferredSize for JLabel – 基本上你必须从JLabel获取textLength (以像素为单位),有3种正确的方法,但我喜欢:

     SwingUtilities.computeStringWidth(FontMetrics fm, String str) 
  2. 现在你可以正确地为JLabel设置setPreferredSize (请通过defalut将需要添加+5 – +10到返回SwingUtilities.computeStringWidthInteger

  3. 呼叫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再次布局其子组件

编辑

这显然是行不通的