2016-05-13 3 views
1

Ich verwende JavaFX/JXBrowser, um eine Warnung/einen Dialog anzuzeigen, wenn die in den Browser geladene Webseite Window.alert oder window.confirm aufruft. Ich kann jedoch nicht herausfinden, wie das Ergebnis des Bestätigungsdialogs (wahr/falsch) an JS zurückgegeben wird. Da alert.showAndWait() eine blockierende Funktion ist, sollte JS auf dieses Ergebnis warten. ShowAndWait wird jedoch auch in einer Platform.runLater-Runnable aufgerufen, daher kann ich das Ergebnis nicht zurückgeben. Kurz vor dem Schreiben von JS-Funktionen, um den True/False-Code zu machen und diese basierend auf dem Ergebnis von showAndWait aufzurufen, gibt es noch eine andere Option?Ist es möglich, das Ergebnis eines JS-Bestätigungsdialogs von JXBrowser an den JS-Abschnitt zurückzugeben, der es aufgerufen hat?

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

Antwort

1

Sie können die folgende Methode verwenden:

@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 Änderungen vorgenommen werden müssen. 1. 'if (result.get() == ButtonType.YES)' sollte mit 'ButtonType.OK' verglichen werden. 2. Es gibt keinen Aufruf an 'latch.countDown();'. Das kann am Ende von 'if (result.isPresent())' hinzugefügt werden. Diese beiden Änderungen haben es funktioniert. Es ist jedoch ein Problem, es zu verwenden, während die Bühne auf Vollbild eingestellt ist. Dadurch wird die Bühne in den Hintergrund von _all_ windows versetzt, bis eine Option im Bestätigungsdialog ausgewählt wird. –

Verwandte Themen