1

ブラウザーにロードされた Web ページが Window.alert または window.confirm を呼び出すときに、JavaFX/JXBrowser を使用してアラート/ダイアログを表示しています。しかし、確認ダイアログの結果(true/false)をJSに返す方法がわかりません。alert.showAndWait() はブロッキング関数であるため、JS はこの結果を待つ必要があります。ただし、showAndWait は Platform.runLater ランナブルでも呼び出されるため、結果を返すことができません。true/false コードを実行する JS 関数を作成し、showAndWait の結果に基づいてそれらを呼び出す以外に、他のオプションはありますか?

browser.setDialogHandler(new DialogHandler() {
@Override
        public CloseStatus onConfirmation(DialogParams params) {
            Platform.runLater(new Runnable() {

                @Override
                public void run() {
                    Alert alert = new Alert(AlertType.CONFIRMATION);
                    alert.setTitle("Yes/No");
                    alert.setHeaderText(null);
                    alert.setContentText("Yes/No");
                    Optional<ButtonType> result = alert.showAndWait();
                    if(result.isPresent())
                    {
                        if(result.get()==ButtonType.YES)
                        {
                            //Send true to calling JS function
                        }else
                        {
                            //Send false to calling JS function
                        }

                    }else
                    {
                        System.out.println("No result!");
                    }
                }
            });
            return null; //because I need to return something and I can't figure out how to get values from the runnable
        }
...
}
4

1 に答える 1

1

次のアプローチを使用できます。

@Override
public CloseStatus onConfirmation(DialogParams params) {
    final AtomicReference<CloseStatus> status = new AtomicReference<CloseStatus>();
    final CountDownLatch latch = new CountDownLatch(1);
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            Alert alert = new Alert(AlertType.CONFIRMATION);
            alert.setTitle("Yes/No");
            alert.setHeaderText(null);
            alert.setContentText("Yes/No");
            Optional<ButtonType> result = alert.showAndWait();
            if (result.isPresent()) {
                if (result.get() == ButtonType.YES) {
                    status.set(CloseStatus.OK);
                } else {
                    status.set(CloseStatus.CANCEL);
                }

            } else {
                System.out.println("No result!");
            }
        }
    });
    try {
        latch.await();
    } catch (InterruptedException ignored) {
        Thread.currentThread().interrupt();
    }
    return status.get();
}
于 2016-05-16T09:31:56.077 に答える