2013-10-10 6 views
0

Как указано в моем названии, мой showConfirmDialog никогда не ждет нажатия кнопки «Да» или «Нет», когда я его вызываю.JOptionPane.showConfirmDialog не останавливает текущий поток

Первоначально я столкнулся с ошибкой, которая включала в себя получение пустой JOptionPanes, поэтому теперь я использую метод invokeLater. Я не слишком хорошо знаком с этой концепцией, поэтому заранее прошу прощения.

public int firstGame() 
{ 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      yOrN = JOptionPane.showConfirmDialog(null, 
        "Are you ready to play?\n", "Play?", JOptionPane.YES_NO_OPTION); 
     } 
    }); 
    return yOrN; 
    // will return 0 if yes and 1 if no. 

} 

Перед использованием invokeLater, он работает нормально (за исключением пустых JOptionPane с исключением). Этот метод запускает другой поток? Howcome my showInputDialog ждет ввода, а не этого?

+0

не понимают, его о стандарте, требование обернуть JOptionPane в invokeLater, – mKorbel

ответ

2

SwingUtilities.invokeLater делает только что, она помещает Runnable на очереди событий для запуска позже, а это означает, что как только вы назвали, ваше return оператор выполняется почти сразу после него и какое-то время в будущем, будет отображаться JOptionPane ,

Запросов этого типа помещаются в очереди событий и процессы с помощью Event Пропустите диспетчерскую

Посмотрите How to pass results from EDT back to a different thread? для возможного решения ...

+0

Благодарим вас за аккуратное объяснение! И дерьмо решение - выход из сферы того, что я узнал до сих пор. Я посмотрю. Еще раз спасибо! – kir

+0

Я делаю это в течение 14 лет, и «Будущее» все еще пугает меня: P ... опрятное решение, хотя – MadProgrammer

+0

@MadProgrammer +1 для isEventDispatch ..., в другой руке говорить о sceleton и его извещателях неправильно, нет идея, как создать пример кода, вызванный OPs ... – mKorbel

Смежные вопросы