Дождитесь результата сообщения от пользователя, такого как JOptionPane

Я хочу, чтобы мой собственный класс сообщений вел себя так же, как JOptionPane в следующем фрагменте кода:

int reply = JOptionPane.showConfirmDialog(
     null, 
     "Is the weather beautifull?", 
     "Question", 
     JOptionPane.YES_NO_OPTION
);
if (reply == JOptionPane.YES_OPTION) {
    // do something in response to yes...
} else {
    // do something in response to no...
}

Так что я точно хочу, чтобы я создал свой собственный объект сообщения, показывал его и реагировал на нажатие кнопки, сделанное пользователем в псевдокоде, например:

show my question message;
wait for user button press without blocking UI thread;
do something depending on which button the user pressed;

Я перепробовал множество вещей, чтобы мое окно сообщений действовало как JOptionPane с Future, Wait/Notify и т. д., но всегда заканчивалось тем, что я блокировал свое окно. Поток пользовательского интерфейса.

В чем секрет этого JOptionPane? :)


person alex    schedule 11.11.2013    source источник


Ответы (1)


См. документы:

Диалог может быть модальным. Когда модальный диалог отображается, он блокирует ввод данных пользователем во все остальные окна программы. JOptionPane создает модальные диалоги JDialog. Чтобы создать немодальный диалог, вы должны использовать класс JDialog напрямую.

См. модальное окно:

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

Что касается реализации, я думаю, что свинг блокирует EDT и создает еще один поток для модального диалога.

person Maroun    schedule 11.11.2013
comment
Спасибо за ваш ответ. Я понимаю, что JoptionPan как диалоговое окно блокирует все остальные действия пользователя, но как сделать так, чтобы поток ждал ответа? Или лучше спросите, как я могу заставить свой поток ждать результата, не блокируя поток пользовательского интерфейса? - person alex; 11.11.2013
comment
Хорошо, я решил это, вот пример кода для моего решения: open-sourced.de/ show_article.php?articleid=61 - person alex; 06.03.2014