动态改变JDialog的宽度

发布于 2024-11-26 14:51:29 字数 132 浏览 0 评论 0 原文

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

I have created a JDialog which contains a JLabel. Because the length of text, which changes based on users' input, can contain a large number of characters, there is the need to dynamically change the length of the JDialog based on the size of length of the JDialog. I have tried the pack() method but it's not the case for it. Can anyone give me some tips? Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

幽梦紫曦~ 2024-12-03 14:51:29
  1. getPreferredSize for JLabel - 基本上你必须从 JLabel 获取 textLength(以像素为单位),有 3 个正确的方式,但我喜欢:

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

  3. 调用pack(); 在顶级容器(JDialog)上。
  1. getPreferredSize for JLabel - basically you have to get textLength from JLabel in pixels, there are 3 correct ways, but I love:

    SwingUtilities.computeStringWidth(FontMetrics fm, String str)
    
  2. Now you are able to setPreferredSize for JLabel correctly (please by defalut is there needed to add +5 - +10 to the Integer that returns SwingUtilities.computeStringWidth)

  3. Call pack(); on the top level container (the JDialog).
丘比特射中我 2024-12-03 14:51:29

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


这是一个很好的 线程。我建议听听 @Andrew Thompson 提供的答案和建议,他实际上是这里的一位杰出用户。

Try invoking validate() on the JDialog. I just realized that this will not work.


Here's a nice thread that discusses this issue. I would recommend listening to the answer and suggestions provided by @Andrew Thompson, who's actually a prominent user here.

悲凉≈ 2024-12-03 14:51:29

另一种选择是将文本放入 JTextArea 中,然后将其放入 JScrollPane 中。

EG

滚动窗格中的文本区域

代码

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);
            }
        });
    }
}

Another alternative is to put the text into a JTextArea and put that in a JScrollPane.

E.G.

Text Area in Scroll Pane

Code

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);
            }
        });
    }
}
你げ笑在眉眼 2024-12-03 14:51:29

为什么 pack() 不适合你?

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

Why will pack() not work for you?

You could use setSize and base the width off the width of the JLabel. Call this method whenever the user changes the input.

囍孤女 2024-12-03 14:51:29

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

编辑

这显然不起作用

Trying using the validate() method, this will cause the JDialog to lay out its subcomponents again

EDIT

This apparently will not work

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文