【发布时间】:2011-10-14 07:04:16
【问题描述】:
我创建了一个包含 JLabel 的 JDialog。由于根据用户输入而改变的文本长度可以包含大量字符,因此需要根据JDialog的长度大小动态改变JDialog的长度。我已经尝试过 pack() 方法,但事实并非如此。谁能给我一些提示?提前致谢!
【问题讨论】:
-
pack() 会起作用的!如果它不起作用,那么您需要发布 SSCCE 来证明问题。
我创建了一个包含 JLabel 的 JDialog。由于根据用户输入而改变的文本长度可以包含大量字符,因此需要根据JDialog的长度大小动态改变JDialog的长度。我已经尝试过 pack() 方法,但事实并非如此。谁能给我一些提示?提前致谢!
【问题讨论】:
另一种选择是将文本放入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);
}
});
}
}
【讨论】:
尝试使用validate() 方法,这将导致JDialog 再次布置其子组件
编辑
这显然行不通
【讨论】:
为什么pack() 不适合你?
您可以使用setSize 并将宽度设置为JLabel 的宽度。每当用户更改输入时调用此方法。
【讨论】:
getPreferredSize for JLabel - 基本上你必须以像素为单位从JLabel 得到textLength,有3 种正确的方法,但我喜欢:
SwingUtilities.computeStringWidth(FontMetrics fm, String str)
现在您可以正确地为JLabel 使用setPreferredSize(请默认是否需要将+5 - +10 添加到返回Integer 的Integer)
JDialog)上调用pack();。【讨论】:
尝试在 我刚刚意识到这行不通。 JDialog 上调用validate()。
这是一个很好的thread,它讨论了这个问题。我建议听听@Andrew Thompson 提供的答案和建议,他实际上是这里的知名用户。
【讨论】: