为什么从另一个控制器调用的方法不能更改场景?

时间:2019-04-18 23:00:04

标签: java button javafx controller scenebuilder

我使用firstController获得了first.fxml场景,它是BorderPane,左侧带有一个按钮(birthCert)。

当我单击按钮(birthCert)时,我成功地将second.fxml加载到BorderPane的中心。

    @FXML
    void birthCert(ActionEvent event) {

        Parent root;
        try {
            root = load(getClass().getResource("second.fxml"));
            id_borderPane.setCenter(root);

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

    }

second.fxml与secondController类连接,并且具有1个按钮(sendRequest)。单击此按钮后,我将创建firstController的实例,并希望调用方法setscene将Third.fxml加载到borderPane的中心。

third.fxml仅显示消息“您的请求已发送”。

问题是,当我使用firstController实例在类secondController中调用方法setcene时

c.setscene();
 public void setscene() {
        Parent root;
        try {
            root = load(getClass().getResource("third.fxml"));
            id_borderPane.setCenter(root);

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

它不会将Third.fxml加载到BorderPane的中心,只有second.fxml仍然加载,什么也不会发生。

我尝试了控制打印,并测试了root是否为null,但打印工作正常且root不为null,所以我真的不明白是什么原因导致它在BorderPane中心未显示third.fxml

这是整个代码:

package controllers;

import static javafx.fxml.FXMLLoader.load;
import java.io.IOException;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;

public class firstController {

    @FXML
    private BorderPane id_borderPane;

    @FXML
    void birthCert(ActionEvent event) {

        Parent root;
        try {
            root = load(getClass().getResource("second.fxml"));
            id_borderPane.setCenter(root);

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

    }

    public void setscene() {
        Parent root;
        try {
            root = load(getClass().getResource("third.fxml"));
            id_borderPane.setCenter(root);

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

}
package controllers;

import java.io.IOException;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.TextArea;
import javafx.scene.input.MouseEvent;

public class secondController{

    @FXML
    void SendRequset(MouseEvent event) throws IOException  {

        FXMLLoader loader = new FXMLLoader(getClass().getResource("first.fxml"));
        loader.load();
        UserGUISendReqController c = loader.getController(); // instance of firstController
        c.setscene();
    }
}

非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

您有:

FirstController
|- SecondController

然后在第二个控制器中,单击按钮添加正在执行的第三个控制器

FirstController
|- SecondController
   |- new FirstController.setScene()

您应该实例化一个新的FirstController,应该调用SecondController的父级,或者以某种方式将对FirstController的引用传递给第二个Controller。

您要在SecondController上使用getParent或将活动的FirstController传递到SecondController的其他方法,以便在调用它时是正确的。

ps。人们还会对您的命名约定发表评论,而不遵循标准。