2016-05-13 1 views
1

ブラウザにロードされたWebページがWindow.alertまたはwindow.confirmを呼び出すときに、JavaFX/JXBrowserを使用して警告/ダイアログを表示しています。しかし、確認ダイアログの結果(true/false)をJSに返す方法を知ることはできません。 alert.showAndWait()はブロッキング関数なので、JSはこの結果を待つ必要があります。ただし、showAndWaitはPlatform.runLaterの実行可能ファイルでも呼び出されるため、結果を返すことはできません。 true/falseコードを実行してshowAndWaitの結果に基づいてJS関数を呼び出すJS関数を書くのに手間がかかりませんが、他にもオプションがありますか?JXBrowserが提示したJS確認ダイアログの結果を、呼び出したJSセクションに戻すことはできますか?

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 
     } 
... 
} 

答えて

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

2変更がなされる必要があります。 1. 'if(result.get()== ButtonType.YES)'を 'ButtonType.OK'と照合する必要があります。 2. 'latch.countDown();'の呼び出しはありません。これは 'if(result.isPresent())'の最後に追加することができます。 これらの2つの変更が機能しました。ステージがフルスクリーンに設定されている間にそれを使用することは問題です。これは、確認ダイアログのオプションが選択されるまで、_all_ windowsの背景にステージを送ります。 –

関連する問題