“快速又脏”的方法是给的
Stage1Controller引用
Stage2Controller:
public class Stage1Controller { private final Stage2Controller stage2Controller ; public void setStage2Controller(Stage2Controller stage2Controller) { this.stage2Controller = stage2Controller ; } // ... @FXML private void handleTranslate (ActionEvent event){ translateFirstStage(); stage2Controller.setLabel(...); } // other pre as before ...}现在在您的主应用程序中:
public class MainApp extends Application { private Stage1Controller stage1Controller ; private Stage2Controller stage2Controller ; @Override public void start(Stage primaryStage) { firstStage(); secondStage(); stage1Controller.setStage2Controller(stage2Controller); // ... } public void firstStage() { try { // Load root layout from fxml file. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("view/stage1.fxml")); rootLayout = (BorderPane) loader.load(); stage1Controller = loader.getController(); // Show the scene containing the root layout. Scene scene = new Scene(rootLayout); primaryStage.setScene(scene); primaryStage.show(); } catch (IOException e) { e.printStackTrace(); } } public void secondStage() { try { // Load root layout from fxml file. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("view/stage2.fxml")); XD = (AnchorPane) loader.load(); stage2Controller = loader.getController(); // Show the scene containing the root layout. Scene scene = new Scene(XD); Stage stage = new Stage(); stage.setScene(scene); stage.show(); } catch (IOException e) { e.printStackTrace(); } } // ...}但是,更可靠的方法是让两个控制器访问共享的模型类,并存储数据。如果使用JavaFX可观察属性表示数据,则控制器可以侦听其关心的属性的更改。例如:
public class Model { private final StringProperty text = new SimpleStringProperty("Initial text..."); public StringProperty textProperty() { return text ; } public final void setText(String text) { textProperty().set(text); } public final String getText() { return textProperty().get(); } // other properties as needed...}现在,您的控制器将如下所示:
public class Stage1Controller { private Model model ; public void setModel(Model model) { this.model = model ; } @FXML private void handleTranslate (ActionEvent event){ translateFirstStage(); model.setText(...); // value will appear in stage2 controller's label! } // ...}和
public class Stage2Controller { @FXML private Label lb ; private Model model ; public void setModel(Model model) { lb.textProperty().unbind(); this.model = model ; lb.textProperty().bind(model.textProperty()); } // ...}在这种情况下,您的主应用程序如下所示:
public class MainApp extends Application { private final Model = new Model(); @Override public void start(Stage primaryStage) { // ... } public void firstStage() { try { // Load root layout from fxml file. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("view/stage1.fxml")); rootLayout = (BorderPane) loader.load(); Stage1Controller controller = loader.getController(); controller.setModel(model); // Show the scene containing the root layout. Scene scene = new Scene(rootLayout); primaryStage.setScene(scene); primaryStage.show(); } catch (IOException e) { e.printStackTrace(); } } public void secondStage() { try { // Load root layout from fxml file. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("view/stage2.fxml")); XD = (AnchorPane) loader.load(); Stage2Controller controller = loader.getController(); controller.setModel(model); // Show the scene containing the root layout. Scene scene = new Scene(XD); Stage stage = new Stage(); stage.setScene(scene); stage.show(); } catch (IOException e) { e.printStackTrace(); } }}


