Подождите, пока интерфейс Swing закроется, прежде чем продолжить
Я искал решение своего вопроса, но у меня возникают трудности даже с определением условий поиска.
У меня есть метод, который создает графический интерфейс Swing с использованием invokeLater, где пользователь выполняет некоторые задачи. Как только задача завершена, окно закрывается, и начальный вызывающий поток (например, метод) должен возобновить выполнение. Чтобы быть более конкретным, вот краткое изложение метода:
public class dfTestCase extends JFrame{
public dfTestCase{
... //GUI code here
}
public String run()
{
CountDownLatch c = new CountDownLatch(1);
Runnable r = new Runnable()
{
public void run()
{
setVisible(true); //make GUI visible
}
};
javax.swing.SwingUtilities.invokeLater(r);
//now wait for the GUI to finish
try
{
testFinished.await();
} catch (InterruptedException e)
{
e.printStackTrace();
}
return "method finished";
}
public static void main(String args[]){
dfTestCase test = new dfTestCase();
System.out.println(test.run());
}
}
В графическом интерфейсе у меня есть actionListeners для кнопок, которые будут закрывать и считать CountDownLatch.
Хотя CountDownLatch работает, он не подходит для моих целей, потому что мне нужно запустить этот графический интерфейс несколько раз, и нет никакого способа увеличить защелку. Я ищу более элегантное решение - я думаю, что мне нужно использовать потоки, но я не уверен, как это сделать.
Любая помощь приветствуется!
Обновление Некоторые пояснения: происходит то, что внешний класс вызывает функцию dfTestCase.run() и ожидает, что будет возвращена строка. По сути, поток является линейным с внешним классом, вызывающим dfTestCase.run()-> вызываемый графический интерфейс -> пользователь принимает решение и нажимает кнопку -> возвращается элемент управления в исходный вызывающий поток и выполняется run () выполнен.
На данный момент мое грязное решение состоит в том, чтобы просто поставить цикл while с флагом, чтобы непрерывно опрашивать состояние графического интерфейса. Я надеюсь, что кто-то еще может предложить более элегантное решение в конце концов.
public class dfTestCase extends JFrame{
public dfTestCase{
... //GUI code here
JButton button = new JButton();
button.addActionListener{
public void actionPerformed(ActionEvent e){
flag = true;
}
}
}
public String run()
{
Runnable r = new Runnable()
{
public void run(){
setVisible(true); //make GUI visible
};
javax.swing.SwingUtilities.invokeLater(r);
//now wait for the GUI to finish
while (!flag){
sleep(1000);
}
return "method finished";
}
public static void main(String args[]){
dfTestCase test = new dfTestCase();
System.out.println(test.run());
}
}
2 ответа
Модальные диалоги и SwingUtilities#invokeAndWait
ISO invokeLater
должен позволять вам захватывать ввод пользователя и продолжать вызывающий поток только тогда, когда пользовательский интерфейс расположен
В качестве примера использования диалогов модели вы можете проверить класс ParamDialog, который я написал. В частности, проверьте ParamDialog.getProperties (Properties);
http://tus.svn.sourceforge.net/viewvc/tus/tjacobs/ui/dialogs/