从javafx中的第二个控制器中的一个控制器访问变量

时间:2016-11-21 17:00:25

标签: java javafx

我知道传递参数有很多线程,但我仍然不明白。

我有Main.fxmlMainController级。在这个类中,我创建了变量int x = 5。然后我点击这个阶段的按钮,用SecondController创建一个新阶段,我可以修改这个值。在MainController中是x值的setter和getter方法。在SecondController我可以从x获取MainController值并进行编辑但最后当我关闭第二阶段时,我尝试使用来自{{1的setter方法的新数字设置此编辑值}}。然后我关闭它并再次以与第一次相同的方式打开它。但我看不到新的编辑值,我再次看到这是默认创建的。

以下是我的MainController,名为MainController

FirstController

这是我的public class FirstController { private int x = 5; @FXML private Label label; @FXML void click(ActionEvent event) { SecondController secondController = new SecondController(); secondController.startSecondController(new Stage()); } @FXML public void initialize() { label.setText(Integer.toString(x)); } //constructor public FirstController() { } public int getX() { return x; } public void setX(int x) { this.x = x; } }

SecondController

我认为对此问题的描述足以理解这一点。有谁能举例说明如何实现我的目标?

1 个答案:

答案 0 :(得分:0)

我想了很多关于@James_D说的话,我已经完成了我的代码。这是控制器可以在彼此之间进行通信的结果: FirstController课程:

public class FirstController {

    private IntegerProperty x = new SimpleIntegerProperty();

    SecondController secondController;

    @FXML
    private Label label;

    @FXML
    void click(ActionEvent event) {
        Stage stage = new Stage();
        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("Second.fxml"));
        try
        {
            Pane pane = loader.load();
            secondController = loader.getController();
            secondController.setLocalX(x.getValue());
            secondController.setFirstController(this);
            Scene scene = new Scene(pane, 300, 300);
            stage.setTitle("Second Window");
            stage.setScene(scene);
            stage.show();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    @FXML
    public void initialize()
    {
        label.setText(Integer.toString(x.getValue()));
        x.addListener( observable -> {
            label.setText(Integer.toString(x.getValue()));
        });
    }

    //constructor
    public FirstController() {
        x.set(5);
    }

    public int getX() {
        return x.getValue();
    }

    public void setX(int x) {
        this.x.set(x);
    }
}

SecondControllerx改变FirstController值:

public class SecondController {
    @FXML
    private TextField testArea;

    private FirstController firstController;

    private int localX;

    public void setFirstController(FirstController firstController) {
        this.firstController = firstController;
    }


    public void setLocalX(int x)
    {
        localX = x;
        testArea.setText(Integer.toString(localX));
    }


    @FXML
    void click(ActionEvent event) {
        localX = Integer.parseInt(testArea.getText());
        firstController.setX(localX);
    }

    @FXML
    public void initialize()
    {
        testArea.setText(Integer.toString(localX));
    }
}

这样好吗?或者更好地尝试使用afterburner.fx框架注入?