Проблема с JOptionPane

771
5
Почему когда я пытаюсь вывести сообщение через JOptionPane, майнкрафт зависает?

Код:
JOptionPane.showMessageDialog(null, "Зависает при загрузке игры");
 
1,990
18
105
Потому что showMessageDialog перехватывает на себя весь фокус и приостанавливает активность всего остального приложения. Плюшки свинга, вот такие. Обычно эти диалоги используют для ввода значений, и очень удобно писать это примерно так:
Код:
String input = JOptionPane.showInputDialog(<args...>);
Не надо никаких хандлеров, ничего - он сразу запишет нужное значение по нажатию кнопки OK.

Создавай отдельный фрейм и там добавляй JLabel.
[merge_posts_bbcode]Добавлено: 09.04.2014 01:49:09[/merge_posts_bbcode]

Или отдельным потоком запускай:
Код:
private void showMessage(String message) {
    Thread t = new Thread {
        public void run() {
            JOptionPane.showMessageDialog(null, message);
        }
    });
}
 
771
5
Oldestkon написал(а):
Потому что showMessageDialog перехватывает на себя весь фокус и приостанавливает активность всего остального приложения. Плюшки свинга, вот такие. Обычно эти диалоги используют для ввода значений, и очень удобно писать это примерно так:
Код:
String input = JOptionPane.showInputDialog(<args...>);
Не надо никаких хандлеров, ничего - он сразу запишет нужное значение по нажатию кнопки OK.

Создавай отдельный фрейм и там добавляй JLabel.
[merge_posts_bbcode]Добавлено: 09.04.2014 01:49:09[/merge_posts_bbcode]

Или отдельным потоком запускай:
Код:
private void showMessage(String message) {
    Thread t = new Thread {
        public void run() {
            JOptionPane.showMessageDialog(null, message);
        }
    });
}
Ну я подозревал, что что-то с потоками.
Надо будет почитать про них, а то я бревно.
P.S А стартовать его в этом методе не нужно?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
А разве не
SwingUtils.invokeLater(() -> {
  //код
})
?
 
1,990
18
105
Нет. invokeLater это хорошо, но везде его пихать не нужно, хотя сначала я тоже такой вариант на форум запостил. Он нужен только если ты вызываешь UI из другого потока (к примеру для изменения элементов GUI) и надо дождаться определенной обработки данных - Swing ставит его в очередь. Тут таких изощрений не нужно - обычного потока с головой хватит. Короче его используют в основном, чтобы графика интерфейса не лажала.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Нуок.
 
771
5
А если я вызову раз 15 этот метод, то потоки не будут висеть и нагружать комп?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ну если код в потоке не бесконечен, то при его завершении поток закрывается.
То бишь когда закроешь окошко - не будет потока его.
 
771
5
anti344 написал(а):
Ну если код в потоке не бесконечен, то при его завершении поток закрывается.
То бишь когда закроешь окошко - не будет потока его.
Понятно, спасибо!
 
Сверху