Динамически изменить ширину JDialog - PullRequest
2 голосов
/ 27 июля 2011

Я создал JDialog, который содержит JLabel.Поскольку длина текста, который изменяется в зависимости от ввода пользователя, может содержать большое количество символов, необходимо динамически изменять длину JDialog в зависимости от размера длины JDialog.Я пробовал метод pack (), но это не так.Кто-нибудь может дать мне несколько советов?Заранее спасибо!

Ответы [ 5 ]

6 голосов
/ 27 июля 2011
  1. getPreferredSize для JLabel - в основном вы должны получить textLength от JLabel в пикселях, есть 3 правильных способа, но я люблю:

    SwingUtilities.computeStringWidth(FontMetrics fm, String str)
    
  2. Теперь вы можете setPreferredSize для JLabel правильно (пожалуйста, по умолчанию необходимо добавить +5 - +10 к Integer, который возвращает SwingUtilities.computeStringWidth)

  3. Вызовите pack(); на контейнере верхнего уровня (JDialog).
3 голосов
/ 27 июля 2011

Другая альтернатива - поместить текст в JTextArea и поместить в JScrollPane.

Е.Г.

Text Area in Scroll Pane

Код

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);
            }
        });
    }
}
3 голосов
/ 27 июля 2011

Попробуйте вызвать validate() на JDialog. Я только что понял, что это не будет работать.


Вот хороший поток , в котором обсуждается эта проблема. Я бы порекомендовал выслушать ответ и предложения, представленные @Andrew Thompson, который на самом деле является выдающимся пользователем здесь.

2 голосов
/ 27 июля 2011

Почему pack() не будет работать для вас?

Вы можете использовать setSize и основывать ширину на ширине JLabel. Вызывайте этот метод всякий раз, когда пользователь изменяет ввод.

1 голос
/ 27 июля 2011

Попытка использования метода validate() приведет к тому, что JDialog снова выложит свои подкомпоненты

EDIT

Это, очевидно, не будет работать

...