如何在控制器类中引用Stage?

张淳云|

主类

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("/application/Main.fxml"));
            Scene scene = new Scene(root);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

MainController.class

    public class MainController implements Initializable {

    @FXML private MediaView mv;
    private MediaPlayer mp;
    private Media me;

    @FXML Slider volumeSlider;

    DoubleProperty width;
    DoubleProperty height;

    Stage stage;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
        String path = new File("src/media/my.mp4").getAbsolutePath();
        me = new Media(new File(path).toURI().toString());
        mp = new MediaPlayer(me);
        mv.setMediaPlayer(mp);
        //mp.setAutoPlay(true);

        stage = (Stage) mv.getScene().getWindow();  // Error occured

        width = mv.fitWidthProperty();
        height = mv.fitHeightProperty();
        width.bind(Bindings.selectDouble(mv.sceneProperty(), "width"));
        height.bind(Bindings.selectDouble(mv.sceneProperty(), "height"));

        volumeSlider.setValue(mp.getVolume() * 100);
        volumeSlider.valueProperty().addListener(new InvalidationListener() {

            @Override
            public void invalidated(Observable observable) {
                // TODO Auto-generated method stub
                mp.setVolume(volumeSlider.getValue() / 100);
            }
        });
    }

    public void play(ActionEvent event){
        mp.play();
        mp.setRate(1);
    }
    public void pause(ActionEvent event){
        mp.pause();
    }
    public void fast(ActionEvent event){
        mp.setRate(2);
    }
    public void slow(ActionEvent event){
        mp.setRate(.5);
    }
    public void reload(ActionEvent event){
        mp.seek(mp.getStartTime());
        mp.play();
    }
    public void start(ActionEvent event){
        mp.seek(mp.getStartTime());
        mp.stop();
    }
    public void last(ActionEvent event){
        mp.seek(mp.getTotalDuration());
        mp.stop();
    }
    public void fullScreen(ActionEvent event){

    }
}

错误

javafx.fxml.LoadException: 
/C:/Users/SOONMYUN/workspace/MediaPlayer/bin/application/Main.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at application.Main.start(Main.java:17)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at application.MainController.initialize(MainController.java:44)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    ... 17 more

我想将舞台从Main类升级到Controller类,但失败了。

因为我应该在Controller类中使用setFullScreen函数。

萨希尔·曼尚达(Sahil Manchanda)

我正在回答如何将阶段对象从主类传递到控制器类中,从而在控制器类中创建一个函数

public void setStage(Stage stage){
this.stage=stage;
}

现在像这样在您的主类中调用此函数

 FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/application/Main.fxml"));
                Parent root = (Parent) fxmlLoader.load();
  ((MainController) fxmlLoader.getController()).setStage(primaryStage);

如果您想要获取舞台对象而不将其从main传递到class到controller类,则可以这样做

1.给您的AnchorPane ID,例如fx:id =“ ap”,然后在您的Controller类中

@FXML
AnchorPane ap;

2.你想要对象的地方

Stage stage = (Stage) ap.getScene.getWindow();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从控制器访问JavaFx Stage?

如何在DTO类中注入@Component以实现Rest控制器中的可重用性?

如何在Spring中访问在类级别指定的控制器的PathVariable?

如何在春季从JSP调用控制器类

iOS-如何在视图控制器中引用视图?

如何在Visual Studio中查找MVC控制器方法的引用

如何在可重用的Razor类库中的控制器中注入服务

如何从控制器类更新MainWindow中的标签?

WebApi控制器-如何在dbcontext结果中隐藏类的某些字段?

如何在控制器方法中添加虚拟类作为参数?

如何在ASP.NET页中获取HTML提交按钮以调用MVC控制器类中的控制器方法

如何在megento中从控制器调用模型类方法?

使用“作为控制器”语法时,如何在子控制器中引用父级的作用域?

如何在AngularJS控制器中引用/要求父控制器?

如何在Java MVC Web应用程序中构造控制器类?

如何在MMDrawerController左/右导航控制器中引用实例方法?

如何在控制器中控制页面路由?

如何在angularjs的子模块中引用控制器

如何在Swift的“模型”组件中设置委托视图控制器类

如何在Swift中引用导航控制器?

如何在控制器中包括不是模型的类

如何引用不在控制器目录中的控制器中的功能?

如何在MVC中测试控制器类?

如何在MVC 4中从控制器访问私有构造函数到模型类

如何在静态方法或控制器外的类中获取 applicationDbContext 的 dbContext

如何在 Laravel 的控制器中使用类

如何在准备中的视图控制器之间通过引用传递 swift 数组(对于 segue:?

如何在 EXTJS 中获取主控制器的引用?

如何在 .net core 中的控制器的新类对象中提供 ILogger<ClassName> 实例?