2016-10-28 5 views
3

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

    } 
} 

Ошибка

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 

Я хочу получить этап от основного класса до класса контроллера, но он не прошел.

Потому что я должен использовать функцию setFullScreen в классе Controller.

ответ

2

я отвечаю, как передать объект сценического из основного класса в класс контроллера создать функцию в классе контроллера

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

, если вы хотите получить объект сцены, не передавая его от основного класса к классу контроллера, вы можете сделать это

1.Введите идентификатор к вашей AnchorPane, например. FX: ID = "ар" то в классе контроллера

@FXML 
AnchorPane ap; 

2.Where вы хотите объект

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

Спасибо большое !! Он работает –

+0

Рад, что это помогло.пожалуйста, подтвердите и принимайте ответ –

+0

Прошу прощения, что я не мог выдвинуть свою кандидатуру, потому что у меня недостаточно репутации. –

1

Чтобы получить доступ к стадии от контроллера:

  • Создать метод установки для переменной ступени в вашем классе контроллера
  • Получить экземпляр контроллера в классе Main.java

  • Установить переменную сценический контроллер через присваиватель в Main.java

    Иллюстрация:

    Шаг 1:

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

    Этап 2 и 3:получить экземпляр контроллера и установить сцену с помощью сеттер метода

    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

Я ценю вас. Я решил проблему благодаря вашему ответу! –

+0

приветствуются –

Смежные вопросы