2

Antlr 4 では、このようなコードは一般的な main 関数で機能します。

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 は、「OK」ボタンをクリックする前にジャントによって閉じられました。「検査」機能に飛び込みました。その主なロジックフローは次のとおりです。

   .....
 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();
    }

sth を実行する前にモデル JDialog が閉じられるのはなぜですか? 「検査」の戻り値を使用しましたが、それでも機能しました。

       Future<JDialog> fu = tree.inpect(parser);
       fu.get();

助けはありますか?

4

1 に答える 1

3

続行する前にウィンドウが閉じるのを待つ必要がある場合に備えて、ユーティリティ メソッドが提供されています。

Future<JDialog> future = tree.inspect(parser);
Utils.waitForClose(future.get());
于 2013-08-28T11:13:44.357 に答える