Swing JDialog ошибка? - PullRequest
       7

Swing JDialog ошибка?

1 голос
/ 26 марта 2011

Я пытаюсь создать свой собственный диалог, расширяя класс JDialog, это код, который я использовал для запуска:

import javax.swing.JDialog;

public class ColorManager extends JDialog {
    private static final long serialVersionUID = 1L;

    public ColorManager(){
        super();
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }
}

, когда я пытаюсь запустить код, он работает нормально, но я получаюследующее исключение:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE

Я читал, что были проблемы с WINDOWS_EXIT или чем-то в этом роде, но параметр, который я передаю, должен делать эту работу.вещь, которая делает его еще более странным, заключается в том, что когда я изменяю свой класс, чтобы он содержал поле JDialog вместо расширения, он, кажется, работал просто отлично.Я попросил друга проверить это на своем компьютере, и код не выдал исключение, он использует jre версию 1.6.022, а я использую 1.6.022, мы оба используем 64 бит.

, поэтомучто я сделал не так?или это ошибка в JRE?

Редактировать: забыл упомянуть, я использую eclipse
Edit2: я попробовал тот же код в Netbeans, и он работает нормально, в чем может быть моя проблема ??

Ответы [ 2 ]

2 голосов
/ 26 марта 2011

Все методы, которые вы вызываете в конструкторе , должны вызываться в потоке EDT . Не рекомендуется делать это внутри конструктора, но если вы настаиваете, убедитесь, что он работает в потоке Swing (EDT), например:

import javax.swing.JDialog;

public class ColorManager extends JDialog {
    private static final long serialVersionUID = 1L;

    public ColorManager(){
        super();
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                this.pack();
                this.setVisible(true);
             }
         });
    }
}

IMO лучший способ сделать это - переместить это в отдельный метод, а затем вызвать его после создания вашего ColorManager экземпляра.

При использовании Swing вы всегда должны придерживаться правил многопоточности Swing. Более подробную информацию можно найти на

http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

0 голосов
/ 04 марта 2018

Все вышеперечисленное решение великолепно, у меня тоже был очень тревожный момент с шоу JDialog.

В NETBEAN 8.2 просто щелкните левой кнопкой мыши JFrame и выберите свойства, затем установите свойство defaultCloseOperation ... Обычно первое в списке,

сделать то же самое для JDialog

... В любом случае, это мой собственный опыт

...