Java 动态更改JDialog的宽度
我创建了一个JDialog,其中包含一个JLabel。由于文本的长度(根据用户的输入而改变)可能包含大量字符,因此需要根据JDialog的长度大小动态改变JDialog的长度。我尝试过pack()方法,但实际情况并非如此。有人能给我一些提示吗?提前谢谢 尝试调用Java 动态更改JDialog的宽度,java,swing,jlabel,jdialog,Java,Swing,Jlabel,Jdialog,我创建了一个JDialog,其中包含一个JLabel。由于文本的长度(根据用户的输入而改变)可能包含大量字符,因此需要根据JDialog的长度大小动态改变JDialog的长度。我尝试过pack()方法,但实际情况并非如此。有人能给我一些提示吗?提前谢谢 尝试调用JDialog。我刚刚意识到这是行不通的 下面是一个讨论这个问题的好例子。我建议听听@Andrew Thompson提供的答案和建议,他实际上是这里的一位杰出用户。为什么pack()不适合你 您可以使用JLabel的宽度作为宽度的基础。
JDialog
。我刚刚意识到这是行不通的
下面是一个讨论这个问题的好例子。我建议听听@Andrew Thompson提供的答案和建议,他实际上是这里的一位杰出用户。为什么
pack()
不适合你
您可以使用
JLabel
的宽度作为宽度的基础。每当用户更改输入时调用此方法。尝试使用validate()
方法,这将导致JDialog
再次布局其子组件
编辑
这显然行不通
getPreferredSize
对于JLabel
-基本上你必须从JLabel
中获取textLength
,以像素为单位,有3种正确的方法,但我喜欢:
SwingUtilities.computeStringWidth(FontMetrics fm, String str)
JLabel
正确设置首选大小
pack()顶层容器(JDialog
)上的code>另一种方法是将文本放入
JTextArea
并放入JScrollPane
中
例如。
代码
pack()会有用的!如果它不起作用,那么你需要发布一个演示问题的帖子。我没有否决,但validate()不会更改问题所问的“对话框宽度”。pack()方法用于此。啊,我明白了,我想它会的。我的错误。盲目否决票不让任何人知道发生了什么。@Hunter,+1否定否决票。我提出了同样的建议,但意识到这不是真的。-1没有必要这么麻烦。通过调用label.setText(…),组件将自动重新验证和重新绘制。将自动重新计算首选大小。所需的只是setText()后面的pack()。@camickr感谢您的评论,如果使用了LayoutManager,则表示同意,而不是AbsoluteLayout();,然后您可以动态设置nothing();无论您是否使用布局管理器,JLabel总是有一个首选的大小。+1对我来说也更有意义。我怀疑用户是否会因为某个字段的文本发生了变化而喜欢看到拨号键的大小不断变化。使用setSize()很少是个好主意。确定总体尺寸时,还需要知道对话框上所有其他组件的尺寸。让pack()来做这项工作。TI将更新我的答案,以反映我所想到的用法。
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);
}
});
}
}