2015-08-27 3 views
0

Я решил обновить свое приложение с помощью JavaFXML, однако мне трудно передать сцену в контроллер. Вот мой контроллер;Этап перехода/фазы переключения JavaFX

public class MainApp extends Application { 

@FXML 
public Stage primaryStage; 

@FXML 
private AnchorPane rootLayout; 
@FXML 
private JobInterface jInterface; 

@Override 
public void start(Stage primaryStage) { 
    primaryStage = new Stage(); 
    setPrimaryStage(primaryStage); 
    initRootLayout(); 
} 

@FXML 
public void initRootLayout(){ 
    try { 
     primaryStage = getPrimaryStage(); 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(MainApp.class.getResource("MainInterface.fxml")); 
     rootLayout = (AnchorPane) loader.load();   
     Scene scene = new Scene(rootLayout);  
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     setPrimaryStage(primaryStage); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@FXML 
private void setJobLayout(){ 
    primaryStage = getPrimaryStage(); 
    jInterface = new JobInterface(); 
    jInterface.initJobLayout(); 
    primaryStage.setScene(jInterface.getScene()); 
} 

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

public Stage getPrimaryStage() { 
    return primaryStage; 
} 

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

Вот это метод, который изменяет сцену, используя другой файл FXML и пытается передать сцену обратно к контроллеру;

public class JobInterface { 

private AnchorPane rootLayout; 
private Scene scene; 

public void initJobLayout(){ 
    try { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(MainApp.class.getResource("JobInterface.fxml")); 
     rootLayout = (AnchorPane) loader.load(); 
     scene = new Scene(rootLayout); 
     setScene(scene); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public Scene getScene() { 
    return scene; 
} 

public void setScene(Scene scene) { 
    this.scene = scene; 
} 
} 

Проблема, с которой я сейчас сталкиваюсь, представляет собой исключение NullPointerException в этой строке в главном приложении;

primaryStage.setScene(jInterface.getScene()); 

Я пытаюсь пройти этап между методами, так что я могу только обновить сцены и не должен открыть новый этап каждый раз новый метод называется. Любые идеи о том, где я ошибаюсь?

ответ

1

Не должно быть необходимости проходить сцену или сцену. Ваша основная будет загружать ресурс fxml, который будет иметь ваш контроллер fxml «в порядке» вашего файла fxml.

@Override 
    public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("jobController.fxml"));   
    Scene scene = new Scene(root);   
    stage.setScene(scene); 
    stage.show(); 
} 

Ваш контроллер может выглядеть следующим образом (в зависимости от конструкции FXML):

public class JobController { 

    @FXML 
    private Label label; 

    @FXML 
    private void handleButtonAction(ActionEvent event) {   
     label.setText("This is the controller speaking"); 
    } 
} 

Теперь вы можете «контроль» Ваша стадия (сцена) от контроллера. Если вы собираетесь создать еще один класс, который также должен обновить сцену, передайте ему ссылку на контроллер, например. от контроллера:

TimeClock timeClock = new TimeClock(); 
timeClock.init(this); 

, а затем в TimeClock.java у вас есть:

private final JobController controller; 

public void init (JobController control){ 
    this.controller = control; 
} 

Теперь вы можете получить доступ к любому публичному методу в контроллере из класса TimeClock. Например.

controller.updateLabel("Time clock speaking!"); 
+0

Я немного смущен об этом @Frank. Будет ли в программе только один файл fxml? Как мне (в классе JobInterface) загрузить еще один файл fxml, который имеет совершенно другой интерфейс? – jbanks

+0

Возможно, я вас неправильно понял. Посмотрите на этот вопрос StackOverflow, на который ответил jewelsea: https://gist.github.com/jewelsea/6460130 – Frank

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