2013-11-19 3 views
1

Итак, я довольно новичок в 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(); 

ответ

2
  • Получите все, что синхронизируются и ждать вещи из вашего кода. Все, что будет сделано, это заморозить поток событий Swing, делая ваше приложение бесполезным.
  • Вы не хотите использовать второй JFrame, поскольку приложение обычно имеет только одно главное окно или JFrame, а не несколько.
  • Вы хотите вместо этого использовать модальный диалог, такой как JOptionPane (который может содержать сложные графические интерфейсы), или модальный JDialog (который также может содержать сложный GUI). Не забудьте связать модальный диалог с родительским JFrame. Затем библиотека Swing GUI закроет главное окно до тех пор, пока диалог не будет рассмотрен, и код из основного графического интерфейса возобновится с того места, где диалог стал видимым после того, как диалог больше не отображается.
+1

Незначительное разъяснение: модальный диалог не _freeze_ в главном окне, а взаимодействие с пользователем _block_, как предлагается [здесь] (http://stackoverflow.com/a/18728637/230513). – trashgod

+1

@trashgod: спасибо за разъяснение. Но это больше, чем просто блокировать взаимодействие с пользователем, поскольку оно фактически останавливает поток программы в вызывающем коде прямо в точке, где диалог установлен на видимый. Программный поток возобновляется с той же самой точки после обращения к диалогу. –

+1

Хорошая точка. Я вижу, что учебник использует две фразы для описания этого: _blocks input_ и _captures window focus_. Я хотел подчеркнуть, как главное окно может обновлять свой внешний вид в ответ на события. – trashgod

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