2016-05-13 1 views
1

Я использую JavaFX/JXBrowser для отображения предупреждения/диалога, когда веб-страница, загруженная в браузер, вызывает Window.alert или window.confirm. Однако я не могу понять, как вернуть результат диалога подтверждения (true/false) в JS. Поскольку alert.showAndWait() является блокирующей функцией, JS должен ждать этого результата. Однако showAndWait также вызывается в Platform.runLater, поэтому я не могу вернуть результат. Если не написать JS-функции для выполнения истинного/ложного кода и вызвать их на основе результата showAndWait, есть ли другой вариант?Возможно ли вернуть результат диалогового окна подтверждения JS, представленного JXBrowser, в раздел 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())'. Эти два изменения заставили его работать. Однако использовать его, пока на сцене установлен полноэкранный режим, является проблемой. Это отправляет сцену на фоне _all_ окон, пока не будет выбран параметр в диалоговом окне подтверждения. –

Смежные вопросы