Итак, я довольно новичок в Java Swing, и я наткнулся на определенную трудность. У меня есть основной фрейм (основная часть приложения, которая видна во время выполнения приложения), которая имеет кнопку, которая когда-то нажата, вызывает всплывающее окно (окно) для сбора информации пользователя, а в этом фрейме есть некоторые компоненты. Проблема заключается в том, что я действительно не знаю правильного подхода к вызову всплывающего окна и главного окна, замораживающего выполнение, и до тех пор, пока не будет OK, или нажмите кнопку «Отмена» во всплывающем окне. После этого главный код окна собирает возвращаемые значения из всплывающего окна и возобновляет его. Я попытался использовать синхронизацию, чтобы выполнить это, однако компоненты popup даже не загружаются, только JFrame и JPanel (белый фон), и всплывающее окно зависает в состоянии wait(). Я знаю, что есть способ сделать это с JDialog и другими, но моя главная проблема заключается в том, чтобы выяснить, почему всплывающий кадр не загружает компоненты и не зависает перед условием wait(). (когда я избавляюсь от ожидания() все загружается должным образом).Всплывающее окно Java JFrame
//in Main window Class:
frame.setEnabled(false);
Test test = getNewTest(); //should freeze on wait() in popup window
frame.setEnabled(true);
//in Popup Window Class
public Test getNewTest() {
addPanel.setVisible(true);
addFrame.setVisible(true);
synchronized(flag) {
try {
flag.wait();
} catch (InterruptedException e) {}
}
addPanel.setVisible(false);
addFrame.setVisible(false);
if(success)
return new Test(testName, date);
else return null;
}
//When OK or Cancel button clicked appropriate handler sets
//success value and invokes flag.notify();
Незначительное разъяснение: модальный диалог не _freeze_ в главном окне, а взаимодействие с пользователем _block_, как предлагается [здесь] (http://stackoverflow.com/a/18728637/230513). – trashgod
@trashgod: спасибо за разъяснение. Но это больше, чем просто блокировать взаимодействие с пользователем, поскольку оно фактически останавливает поток программы в вызывающем коде прямо в точке, где диалог установлен на видимый. Программный поток возобновляется с той же самой точки после обращения к диалогу. –
Хорошая точка. Я вижу, что учебник использует две фразы для описания этого: _blocks input_ и _captures window focus_. Я хотел подчеркнуть, как главное окно может обновлять свой внешний вид в ответ на события. – trashgod