2016-10-28 3 views
3

Main.classWie referenziere ich die Stage in der Controller-Klasse?

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

    } 
} 

Fehler

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 

Ich möchte die Bühne von der Hauptklasse zur Controller-Klasse bekommen, aber es war fehlgeschlagen.

Da sollte ich die SetFullScreen-Funktion in der Controller-Klasse verwenden.

Antwort

2

Ich antworte, wie von Hauptklasse zu Ihrer Controller-Klasse Stufe Objekt zu übergeben eine Funktion in der Controller-Klasse erstellen

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

jetzt diese Funktion in Ihrer Hauptklasse nennt wie diese

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

Wenn Sie das Stage-Objekt erhalten möchten, ohne es von der Hauptklasse zur Klasse zur Controller-Klasse zu übertragen, können Sie auf folgende Weise vorgehen:

1. Geben Sie ID zu Ihrem AnchorPane z. fx: id = "ap" dann in Ihrem Controller-Klasse

@FXML 
AnchorPane ap; 

2.Where Sie das Objekt wollen

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

Vielen Dank gesetzt !! Es funktioniert –

+0

Froh, dass es geholfen hat.bitte upvote und akzeptiere die Antwort –

+0

Es tut mir leid, ich konnte nicht upvote, weil ich nicht genug Reputation .. –

1

Um Bühne Zugriff von der Steuerung:

  • eine erstellen Setter-Methode für Bühne Variable in Ihrer Controller-Klasse
  • Erhalten Instanz des Controllers in Ihrer Main.java Klasse

  • die Bühne Variable der Steuerung durch Setter-Methode in Main.java Set

    Illustration:

    Schritt 1:

    public class MainCOntroller { 
    
        private Stage primaryStage; 
    
         public void setPrimaryStage(Stage primaryStage){ 
            this.primaryStage = primaryStage; 
         } 
          ..... 
          .....  
        }  
    

    Schritt 2 und 3:die Instanz des Controllers erhalten und die Bühne mit Setter-Methode

    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(); 
        } 
    } 
    
+0

Ich weiß von Ihnen zu schätzen. Ich habe das Problem dank Ihrer Antwort gelöst! –

+0

Sie sind willkommen –

Verwandte Themen