在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);
}
在我点击“确定”按钮之前,由“tree.inpect(parser)”创建的JDialog刚刚被junt关闭。我潜入“检查”功能,其主要逻辑流程如下:
.....
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();
任何帮助?
答案 0 :(得分:3)
如果您需要在继续之前等待窗口关闭,则提供实用程序方法:
Future<JDialog> future = tree.inspect(parser);
Utils.waitForClose(future.get());