Soonmyun Jang Soonmyun Jang - 1 month ago 12
Java Question

How to reference Stage in controller class?


Main.class


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){

}
}



Error


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


I want to get the Stage from Main class to Controller class but it was failed.

Because I should use the setFullScreen function in Controller class.

Answer

i am answering how to pass stage object from main class to your controller class create a function in your controller class

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

now call this function in your main class like this

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

if you want to get the stage object without passing it from main to class to controller class you can do this way

1.Give id to your AnchorPane e.g. fx:id="ap" then in your Controller class

@FXML
AnchorPane ap;

2.where you want the object

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