繁体   English   中英

在控制器JavaFX FXML之间来回发送数据

[英]Send data back and forth between controllers JavaFX FXML

我在这里发现的所有问题都回答了如何将数据从一个控制器发送到另一个控制器。 但是,我不知道如何从第二个控制器向第一个控制器返回另一个值。 基本上,在第一个控制器仍处于打开状态时来回发送数据。

主班:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("Screen1.fxml"));
            Scene scene = new Scene(loader.load());
            primaryStage.setScene(scene);
            primaryStage.setTitle("Screen 1");
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

屏幕1控制器:

public class Screen1Controller {
    @FXML
    TextField textFieldScreen1;
    @FXML
    Button buttonScreen1;
    @FXML
    Label labelScreen1;

    @FXML
    private void initialize() {

        buttonScreen1.setOnAction((event) -> {
            try{
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(getClass().getResource("Screen2.fxml"));
                Scene scene = new Scene(loader.load());
                Stage stage = new Stage();

                //Send data to Screen 2
                Screen2Controller controller2 = loader.getController();
                controller2.receiveTextFromScreen1(textFieldScreen1.getText());

                stage.setTitle("Screen 2");
                stage.setScene(scene);
                stage.show();
            }   catch (IOException e) {
                    e.printStackTrace();
                }
        });

    }
}

屏幕2控制器:

public class Screen2Controller {
    @FXML
    TextField textFieldScreen2;
    @FXML
    Button buttonScreen2;
    @FXML
    Label labelScreen2;

    @FXML
    private void initialize() {

        buttonScreen2.setOnAction((event) -> {
            Stage currentStage = (Stage) buttonScreen2.getScene().getWindow();
            currentStage.close();
        });
    }

    public void receiveTextFromScreen1(String stringScreen1){
        labelScreen2.setText(stringScreen1);
    }
}

我试图通过以下代码使用相同的策略(在Screen1Controller中创建一个方法并在第二个控制器中实例化Screen1Controller),但是它不起作用。

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("Screen2.fxml"));
//Send data to Screen 1
Screen1Controller controller1 = loader.getController();
controller1.receiveTextFromScreen2(textFieldScreen2.getText());

另外,与此相关的问题(我假设)是第二个问题:每次单击按钮时(例如,使用相同的第二个视图实例),如何在不创建新窗口的情况下更改控制器1中的TextField时更新第二个视图? ?

任何帮助将不胜感激!

创建一个构造函数

public Screen1Controller {
Arrow the parameters
}

并在调用控制器时解析参数:

void on2players(ActionEvent event) throws IOException {
    client.out.println("ACTION NEWGAME 2 4");
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/boardscreen.fxml"));
    loader.setController(new Screen1Controller(parameter);
    Parent root = loader.load();
    Scene scene= new Scene(root);
    Stage window = (Stage) ((Node) event.getSource()).getScene().getWindow();
    window.setScene(scene);
    window.show();
}


public class Screen1Controller implements Initializable {

    public Screen1Controller() {
        //parameters
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
    switch(numberOfPlayers){
    case 2:
    //TODO...creating board for 2 players
    case 3:
    //TODO creatinf board for 3 players
   }

    }

如果这样做,则强制fxml加载程序调用控制器。 注意:您应该将控制器放在.FXML中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM