stackpane与JavaFx之间的通信

stackpane与JavaFx之间的通信,java,javafx,Java,Javafx,我正在做我的JavaFx项目,我有一个很大的问题。我想让我的两个控制器互相通信。我已经阅读了几乎所有解决这个问题的方法,但我找不到适合我的方法。我是一名初级程序员,在我的项目中使用了一些现成的解决方案,但我并不完全理解,我现在陷入了困境。我的工作是如此先进,我不能允许返工 这是我的密码: public class Main extends Application { public static final String ROOT = "Root"; public

我正在做我的JavaFx项目,我有一个很大的问题。我想让我的两个控制器互相通信。我已经阅读了几乎所有解决这个问题的方法,但我找不到适合我的方法。我是一名初级程序员,在我的项目中使用了一些现成的解决方案,但我并不完全理解,我现在陷入了困境。我的工作是如此先进,我不能允许返工

这是我的密码:

public class Main extends Application {
        public static final String ROOT = "Root";
        public static final String ROOT_FXML = "Root.fxml";
        public static final String FIRST_SCREEN = "FirstScreen";
        public static final String FIRST_SCREEN_FXML = "FirstScreen.fxml";
        public static final String SECOND_SCREEN = "SecondScreen";
        public static final String SECOND_SCREEN_FXML = "SecondScreen.fxml";

    @Override
public void start(Stage primaryStage) {
    this.primaryStage = primaryStage;
    ScreensController mainContainer = new ScreensController();
    initRootLayout();

    mainContainer.loadScreen(Main.FIRST_SCREEN, Main.FIRST_SCREEN_FXML);
    mainContainer.loadScreen(Main.SECOND_SCREEN, Main.SECOND_SCREEN_FXML);
    mainContainer.setScreen(Main.FIRST_SCREEN);


    Group root = new Group();
    root.getChildren().addAll(mainContainer);
    rootLayout.setCenter(root);
}

public void initRootLayout() {
    try {
        // Load root layout from fxml file.
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("view/Root.fxml"));
        rootLayout = (BorderPane) loader.load();

        // Show the scene containing the root layout.
        Scene scene = new Scene(rootLayout);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
接口类

public interface ControlledScreen {

    public void setScreenParent(ScreensController screenPage);
}
屏幕控制器类

public class ScreensController extends StackPane {

    private HashMap<String, Node> screens = new HashMap<>();

    public void addScreen(String name, Node screen) {
        screens.put(name, screen);
        System.out.println("added screen " + name);
    }

    public boolean loadScreen(String name, String resource) {
        try {
            FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
            Parent loadScreen = (Parent) myLoader.load();
            ControlledScreen myScreenControler = ((ControlledScreen) myLoader.getController());
            myScreenControler.setScreenParent(this);
            addScreen(name, loadScreen);
            return true;

        } catch (Exception e) {
            System.out.println(e.getMessage());
            return false;
        }
    }

    public boolean setScreen(final String name) {

        if (screens.get(name) != null) {
            if (!getChildren().isEmpty()) {
                getChildren().remove(0);
                // add new screen
                getChildren().add(0, screens.get(name));
            } else {
                getChildren().add(screens.get(name));
            }
            return true;
        } else {
            System.out.println("screen hasn't been loaded!\n");
            return false;
        }
    }

    public boolean unloadScreen(String name) {
        if (screens.remove(name) == null) {
            System.out.println("Screen didn't exist");
            return false;
        } else {
            return true;
        }
    }
}

第一个屏幕和第二个屏幕之间是否有简单的通信方式

既然两个控制器都引用了相同的
ScreensController
实例,为什么不在该类中添加一些JavaFX属性呢。然后,您可以修改并观察两个控制器的相同属性。(一般来说,“我从互联网上复制了一些我不懂的代码”并不是一个很好的起点。你需要了解你正在使用的代码是如何工作的。如果你不了解,你就不会走得很远,在这里发布也不会真的有帮助:没有人能为你理解。)我知道这一点。我只是不知道如何将值从第一个屏幕传递到第二个屏幕。但是如果你这样做了,为什么你需要将值从一个控制器传递到另一个呢?
public class FirstScreenController implements ControlledScreen {

    ScreensController myController;

    @FXML
    void initialize() {

    }

    @Override
    public void setScreenParent(ScreensController screenPage) {
        myController = screenPage;

    }
}