当前位置: 首页 > 知识库问答 >
问题:

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

弘伟彦
2023-03-14

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

我有Main.fxml阶段与MainController类。在这个类中,我创建了例如变量int x=5。然后我单击此阶段上的按钮,它使用秒控制器创建新阶段,我可以在其中修改此值。在MainController中是x值的setter和getter方法。在秒控制器中,我可以从MainController中获取x值并对其进行编辑,但最后当我关闭第二阶段时,我尝试通过MainController中的setter方法将此编辑后的值设置为新数字。然后我关闭它,然后像第一次一样再次打开它。但是我看不到新的编辑值,我再次看到默认创建的相同值。

这是我的主控制器,名为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;
    }
}

这是我的第二控制器

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

我认为描述这个问题就足以理解这一点。有人能给我举个例子如何实现我的目标吗?

共有1个答案

苗盛
2023-03-14

关于@James_D说的话,我想了很多,我已经完成了我的代码。这是控制器可以相互通信的结果:FirstControllerclass:

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

SecondController,它将x值从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));
    }
}

这样好吗?或者最好尝试使用加力喷射。框架?

 类似资料:
  • 我有两个控制器和。我正在读一本书的内容。来自的txt文件,我希望将该文本放置在的文本区域中。代码在中运行并读取良好,但当打开中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的显示String mine包含内容,但它不显示在的文本区域中。请帮助任何人。非常感谢。 FXMLDocumentController代码 在中,有一个我删除了和,这样代码就可以工作了。

  • 需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢

  • 和访问字段,如: 因为我希望有更好的方法来做到这一点。

  • 我有两个控制器和。 在中,我有一个名为的方法。 如何在中访问此方法?

  • 因此,我将一个名为“size”的整数保存到一个名为SettingsStageController的控制器类中。java和我希望通过另一个名为GameStageController的控制器类文件访问该变量。java,但我似乎不知道怎么做。 设置标记控制器。JAVA GameStageController.java

  • 这让我的头撞到了墙上!!!!希望有人能给我指出正确的方向。我确信我在做一些完全愚蠢的事情。我找了又找,但似乎找不出为什么这不管用!!(在IntelliJ IDE 15.x上使用JDK8.x和Scenebuilder)。我试图在GUI上显示数据,但希望access通过编程将这些数据从其他类/方法发送给它。。。。下面是一个简单的概念,我在着手更大的项目之前,正试图让它发挥作用: 我的简单GUI在FXM