2014-10-09 163 views
0

有没有办法在javafx中改变场景setOnEndOfMedia? ..我试过,但它抛出一个NullPointerException改变场景onEndOfMedia

void change(Event event){ 
     try{ 
      Node node=(Node) event.getSource(); 
      Stage stage=(Stage) node.getScene().getWindow(); 
      Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("astrolabe/astrolabe_intro.fxml"));/* Exception */ 

      Scene scene = new Scene(root); 
      stage.setScene(scene); 
      stage.setFullScreenExitHint(""); 

      stage.show(); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 


    } 

,并在媒体端调用change()这样

astrolabe_intro.setOnEndOfMedia(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       System.out.println("tewst"); 
       Event e = new Event(null) ; 
       e.fireEvent(astrolabe_intro1, e); 
       change(e); 


      } 
     }); 
+0

可能重复[什么是空指针异常,以及如何解决它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – DavidPostill 2014-10-09 08:07:44

+0

寻求调试帮助的问题(“* *为什么这个代码不工作?“)必须包含所需的行为,特定的问题或错误以及在问题本身**中重现**所需的最短代码。没有**明确问题陈述**的问题对其他读者没有用处。请参见[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – DavidPostill 2014-10-09 08:08:03

+0

你在哪一行得到'NullPointerException'?你可以给你足够的代码,或者至少有一个解释,所以我们明白你为什么试图在'onEndOfMedia'处理程序中触发事件? – 2014-10-09 11:45:17

回答

1

如果异常从FXMLLoader.load(...)线的到来,机会是路径fxml文件是错误的。将您从呼叫中获得的URL的值记录到getResource(...)以进行检查。

还有:

为什么你需要这个活动呢?您在change方法中唯一使用它的地方是获取节点并获取窗口。你可能有一些其他的节点引用(我假设这是一个控制器。)为什么不只是做

void change(){ 
     try{ 
      Node node= ... ;// any node in your scene will do.... 
      Stage stage=(Stage) node.getScene().getWindow(); 
      Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("astrolabe/astrolabe_intro.fxml"));/* Exception */ 

      Scene scene = new Scene(root); 
      stage.setScene(scene); 
      stage.setFullScreenExitHint(""); 

      stage.show(); 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 


    } 

然后

astrolabe_intro.setOnEndOfMedia(new Runnable() { 
    @Override 
    public void run() { 
     change(); 
    } 
}); 

其在Java中8,你可以缩写为

astrolabe_intro.setOnEndOfMedia(this::change); 
+0

感谢您的帮助:) – Fawzinov 2014-10-09 13:52:41