簡體   English   中英

從javafx中第二個控制器中的一個控制器訪問變量

[英]Access to variable from one controller in second controller in javafx

我知道有很多關於傳遞參數的線程,但是我還是不明白。

我有MainController類的Main.fxml階段。 在這個類中,我創建了例如變量int x = 5 然后,我在該階段上單擊按鈕,這將創建一個帶有SecondController新階段,可以在其中修改此值。 MainControllerx值的setter和getter方法。 SecondController我可以從MainController獲取x值並對其進行編輯,但最后,當我關閉第二階段時,我嘗試通過MainController的setter方法使用新數字設置此編輯后的值。 然后我關閉它的舞台,然后像第一次一樣再次打開它。 但是我看不到新的編輯值,我再次看到了默認創建的值。

這是我的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

public class SecondController {
    @FXML
    private TextField testArea;

    private FirstController firstController;

    private int localX;

    //constructor
    public SecondController() {
        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("First.fxml"));
        try
        {
            loader.load();
            firstController = loader.getController();

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }


    public void startSecondController(Stage stage)
    {
        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("Second.fxml"));
        try
        {
            Pane pane = loader.load();
            Scene scene = new Scene(pane, 300, 300);
            stage.setTitle("Second Window");
            stage.setScene(scene);
            stage.show();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

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

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

我認為描述這個問題足以理解這一點。 有誰能給我榜樣如何實現我的目標?

我對@James_D所說的內容進行了很多思考,我已經完成了代碼。 這就是控制器之間可以相互通信的結果: FirstController class:

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);
    }
}

然后SecondControllerFirstController更改x值:

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框架使用注入?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM