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.
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();
To access stage from controller:
Get instance of the controller in your Main.java class
Set the stage variable of controller through setter method in Main.java
Illustration:
Step 1 :
public class MainCOntroller {
private Stage primaryStage;
public void setPrimaryStage(Stage primaryStage){
this.primaryStage = primaryStage;
}
.....
.....
}
Step 2 and 3: get the instance of controller and set the stage using setter method
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/application/Main.fxml"));
Parent root = (Parent)loader.load();
MainController controller = (MainController) loader.getController();
//set stage
controller.setPrimaryStage(primaryStage);
} catch(Exception e) {
e.printStackTrace();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With