Antlr 4 JDialog, созданный tree.inspect(parser), автоматически закрывается JUnit
В Antlr 4 такой код работает в основной функции.
public static void main(String[] args) {
.....
SicstusPrologParser parser = new SicstusPrologParser(tokens);
ParserRuleContext tree =(ParserRuleContext)parser.program();
tree.inspect(parser);
}
Последний оператор выскакивает модель JDialog, которая показывает древовидную структуру синтаксического анализатора. Но я скопировал код в тестовый пример junit, как показано ниже:
@Test
public void testParserClause() { //clause
.....
SicstusPrologParser parser = new SicstusPrologParser(tokens);
ParserRuleContext tree =(ParserRuleContext)parser.program();
tree.inspect(parser);
}
JDialog, созданный "tree.inpect (parser)", был недавно закрыт пользователем, пока я не нажал кнопку "ОК". Я погрузился в функцию "осмотреть", ее основной логический поток выглядит следующим образом:
.....
Callable<JDialog> callable = new Callable<JDialog>() {
JDialog result;
@Override
public JDialog call() throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
//fill the tree nodes and show the dialog.
result = showInDialog(viewer);
}
});
return result;
}
};
ExecutorService executor = Executors.newSingleThreadExecutor();
try {
return executor.submit(callable);
}
finally {
executor.shutdown();
}
Почему модель JDialog закрыта, прежде чем я с ней что-то сделаю? Я использовал возвращаемое значение "inspect", но оно все равно работало.
Future<JDialog> fu = tree.inpect(parser);
fu.get();
любая помощь?
1 ответ
Решение
Служебный метод предоставляется на тот случай, если вам нужно дождаться закрытия окна, прежде чем продолжить:
Future<JDialog> future = tree.inspect(parser);
Utils.waitForClose(future.get());