【问题标题】:Dynamically change the width of JDialog动态改变JDialog的宽度
【发布时间】:2011-10-14 07:04:16
【问题描述】:

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

【问题讨论】:

  • pack() 会起作用的!如果它不起作用,那么您需要发布 SSCCE 来证明问题。

标签: java swing jlabel jdialog


【解决方案1】:

另一种选择是将文本放入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);
            }
        });
    }
}

【讨论】:

  • +1,对我来说也更有意义。我怀疑用户是否喜欢看到 dilig 不断变化的大小只是因为一个字段的文本发生了变化。
【解决方案2】:

尝试使用validate() 方法,这将导致JDialog 再次布置其子组件

编辑

这显然行不通

【讨论】:

  • 我没有投反对票,但 validate() 不会改变问题所在的“对话框的宽度”。 pack() 方法用于此。
  • 啊,我明白了。我的错。盲目投票不会让任何人知道发生了什么。
  • @Hunter,+1 否决投票。我提出了同样的建议,但意识到这不是真的。
【解决方案3】:

为什么pack() 不适合你?

您可以使用setSize 并将宽度设置为JLabel 的宽度。每当用户更改输入时调用此方法。

【讨论】:

  • 使用 setSize() 很少是个好主意。在确定整体大小时,您还需要知道对话框中所有其他组件的大小。让 pack() 完成这项工作。 T
  • 我将更新我的答案以反映我所考虑的用法。
【解决方案4】:
  1. getPreferredSize for JLabel - 基本上你必须以像素为单位从JLabel 得到textLength,有3 种正确的方法,但我喜欢:

    SwingUtilities.computeStringWidth(FontMetrics fm, String str)
    
  2. 现在您可以正确地为JLabel 使用setPreferredSize(请默认是否需要将+5 - +10 添加到返回IntegerInteger

    李>
  3. 在顶级容器(JDialog)上调用pack();

【讨论】:

  • -1 没必要费这么大的劲。通过调用 label.setText(...) 组件会自动重新验证和重新绘制。首选大小会自动重新计算。所需要的只是 setText() 之后的 pack()。
  • @camickr 感谢评论,同意如果使用了一些LayoutManager,而不是AbsoluteLayout();,那么你可以动态设置nothing();
  • 无论您是否使用布局管理器,JLabel 始终具有首选大小。
【解决方案5】:

尝试在JDialog 上调用validate() 我刚刚意识到这行不通。


这是一个很好的thread,它讨论了这个问题。我建议听听@Andrew Thompson 提供的答案和建议,他实际上是这里的知名用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多