更改场景onEndOfMedia

时间:2014-10-09 07:47:38

标签: java javafx media-player media

有没有办法在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);


            }
        });

1 个答案:

答案 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);