有没有办法在javafx中用setOnEndOfMedia
更改场景? ..我尝试了这个,但它抛出NullPointerException
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 :(得分:1)
如果异常来自FXMLLoader.load(...)
行,则可能是fxml文件的路径错误。将您从通话中获得的网址的值记录到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);