由tree.inspect(解析器)创建的Antlr 4 JDialog由JUnit自动关闭

时间:2013-08-28 07:24:32

标签: java junit executorservice antlr4 invokeandwait

在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();

任何帮助?

1 个答案:

答案 0 :(得分:3)

如果您需要在继续之前等待窗口关闭,则提供实用程序方法:

Future<JDialog> future = tree.inspect(parser);
Utils.waitForClose(future.get());