Я искал ближайший и далеко идущий решение моего вопроса, но у меня возникли трудности с определением условий поиска.Подождите, пока интерфейс Swing будет закрыт, прежде чем продолжить.
У меня есть метод, который создает Swing GUI с помощью 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());
}
}
В GUI, у меня есть actionListeners для кнопок, которые будут замыкаться и обратный отсчет CountDownLatch.
В то время как CountDownLatch работает, он не подходит для моих целей, потому что мне нужно запускать этот графический интерфейс несколько раз, и нет возможности увеличить защелку. Я ищу более элегантное решение - это мое лучшее предположение, что мне нужно будет использовать потоки, но я не уверен, как это сделать.
Любая помощь была бы высоко оценена!
Update Некоторые уточнения: То, что происходит в том, что внешний класс вызова функции dfTestCase.run() и ожидает строки должны быть возвращены. По сути, поток является линейным с внешним вызовом класса dfTestCase.run() -> вызываемый GUI -> пользователь принимает решение и нажимает кнопку -> элемент управления на исходный вызывающий поток возвращается и запускается() выполнен.
На данный момент мое грязное решение состоит в том, чтобы просто поставить цикл 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());
}
}
* «Подождите, свинг интерфейс, чтобы закрыть перед продолжением» * я не понимает большую часть остальной части, но название кричит *** «модальный диалог». *** –
Является ли это графическим интерфейсом Swing, на который вы ссылаетесь выше, отображаемым другим графическим интерфейсом Swing? Если это так, @Andrew дал вам лучшее решение. Поясните свой вопрос, добавив больше важных деталей. –
Если вышеприведенные комментарии не применяются, вы можете просто создать новую защелку каждый раз. Кроме того, вы можете использовать CyclicBarrier, который делает то, что вы просите (может использоваться более одного раза). – assylias