JDialog не правильно размер с обернутой JTextArea

При создании программы я заметил ошибку с вызовом JOptionPane.showMessageDialog(). Я использую кнопку для создания JTextArea, который оборачивает, а затем отображает диалоговое окно, содержащее эту текстовую область. Однако, если текстовая область слишком велика, диалоговое окно не имеет правильного размера в соответствии с высотой JTextArea. Диалог отключает кнопку ОК в этом примере.

Я повторил ошибку в следующем коде:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;


public class DialogBug {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final String text = "looooooooooooooooooooooong text looooooooooooooooooooooooooooooooooooooong text";

        JButton button = new JButton();
        button.setPreferredSize(new Dimension(30, 30));

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JTextArea area = new JTextArea(text, 0, 50);
                area.setEditable(false);
                area.setLineWrap(true);
                area.setWrapStyleWord(true);
                area.append(text);
                area.append(text);
                area.append(text);

                JOptionPane.showMessageDialog(frame, area, "why does it do this", JOptionPane.WARNING_MESSAGE);
            }
        });

        frame.add(button);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Я бы выложил фото, но мне не хватает репутации...

Есть ли способ исправить это без использования JScrollPane?

РЕДАКТИРОВАТЬ: Вот изображение:пример проблемы

1 ответ

Решение

Если вы запустите pack Команда в диалоговом окне (функция в классе Window) изменяет размер в зависимости от подкомпонентов. Для вашего случая вам придется переписать без использования showMessageDialog() чтобы заставить работать изменение размера (поэтому сначала сделайте диалог, добавьте текст, упакуйте, затем покажите его)

Dialog b = new Dialog();
// add stuff
b.pack();

Для моего тестового кода это отлично работало, чтобы диалоговые окна были правильных размеров

  1. Без pack()С командой Pack
  2. С pack()С командой Pack
Другие вопросы по тегам