2015-09-06 135 views
2

我沒有太多的信息,但也許有人面臨同樣的問題。我爲一些朋友編寫了一個應用程序,它包含一些警報對話。問題是警報沒有顯示在它測試過的一臺電腦上(但是在我的電腦上,它確實!)。我有Windows 10和Java 1.8.0_51,測試系統有Windows 7和Java 1.8.0_60。JavaFX警報不顯示?

我用css來設計它。這是我是如何實現它(報警只是一個音頻剪輯):

public void play(Stage stage, Callable<Void> func){ 
     if (alert == null) { 
      alert = new Alert(AlertType.INFORMATION); 
      alert.setTitle("Alarm"); 
      alert.setHeaderText(LanguageLoader.getInstance().getLocalizedString("alarmDialog")); 
      alert.initOwner(stage); 
      alarm.setCycleCount(Timeline.INDEFINITE); 
     } 

     if (!alert.isShowing()) { 
      alarm.play(); 
      stage.toFront(); 
      stage.requestFocus(); 
      Optional<ButtonType> result = alert.showAndWait(); 
      if (result.get() == ButtonType.OK) { 
       alarm.stop(); 
       try { 
        func.call(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }else{ 
      alert.show(); 
     } 
    } 

編輯:我更新到1.8.0_60也和對話也不會被顯示在我的系統上! 這是例外,我得到:

Exception in thread "JavaFX Application Thread" java.lang.IllegalStateException: showAndWait is not allowed during animation or layout processing 
    at javafx.scene.control.Dialog.showAndWait(Unknown Source) 
    at utils.Alarm.play(Alarm.java:38) 
    at note.NoteController.update(Controller.java:76) 
    at java.util.Observable.notifyObservers(Unknown Source) 
    at java.util.Observable.notifyObservers(Unknown Source) 
    at note.NoteModel.update(Model.java:57) 
    at java.util.Observable.notifyObservers(Unknown Source) 
    at java.util.Observable.notifyObservers(Unknown Source) 
    at utils.Watch.lambda$0(Clock.java:35) 
    at com.sun.scenario.animation.shared.TimelineClipCore.visitKeyFrame(Unknown Source) 
    at com.sun.scenario.animation.shared.TimelineClipCore.playTo(Unknown Source) 
    at javafx.animation.Timeline.impl_playTo(Unknown Source) 
    at javafx.animation.AnimationAccessorImpl.playTo(Unknown Source) 
    at com.sun.scenario.animation.shared.InfiniteClipEnvelope.timePulse(Unknown Source) 
    at javafx.animation.Animation.impl_timePulse(Unknown Source) 
    at javafx.animation.Animation$1.lambda$timePulse$26(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javafx.animation.Animation$1.timePulse(Unknown Source) 
    at com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(Unknown Source) 
    at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(Unknown Source) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$405(Unknown Source) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$149(Unknown Source) 

我使用的類時鐘時間表。我想這就是問題所在。我可以在不使用時間線的情況下構建工作時鐘嗎?

回答

3

它看起來像Java 1.8.0_60,類Alert中的showAndWait()方法不能在動畫過程中調用(基本上這就是例外說的)。問題是我使用時間線來檢查系統時間,並在達到一定時間時發出警報。爲了解決這個問題,我改變

Optional<ButtonType> result = alert.showAndWait(); 
      if (result.get() == ButtonType.OK) { 
       alarm.stop(); 
       try { 
        func.call(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

這樣:

alert.showingProperty().addListener((observable,oldValue,newValue)->{ 
       if (!newValue){ 
        alarm.stop(); 
        try { 
         func.call(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 

因此,而不是等待一些輸入,它只是監聽在顯示屬性的更改。不知道如何解決這個問題,如果你使用更多的按鈕,但其他警報。