JavaFX:无法自动更新GridPane

JavaFX:无法自动更新GridPane,javafx,scrollpane,gridpane,Javafx,Scrollpane,Gridpane,好吧,这是一个棘手的问题,已经让我发疯好几天了 我有两个阶段: 用户管理阶段(控制器:UsersAdminController.java) 具有以下元素层次结构: 用户添加阶段:(Controller:AddUserController.java) 作为users admin阶段(参见elements hierarchy)上部锚定窗格滚动窗格的子级,我在UsersAdminController初始化期间添加了一个GridPane,用于列出系统的用户,如所述 当我通过用户添加屏幕添加用户时,我会

好吧,这是一个棘手的问题,已经让我发疯好几天了

我有两个阶段: 用户管理阶段(控制器:UsersAdminController.java) 具有以下元素层次结构: 用户添加阶段:(Controller:AddUserController.java)

作为users admin阶段(参见elements hierarchy)上部锚定窗格滚动窗格的子级,我在UsersAdminController初始化期间添加了一个GridPane,用于列出系统的用户,如所述 当我通过用户添加屏幕添加用户时,我会尝试更新用户管理阶段的GridPane,方法是获取对UsersAdminController的引用,然后调用更新其内容的方法。 但是,无法更新GridPane。(我似乎无法对滚动窗格和gridpane执行任何与gui相关的操作,尽管我设法获得了对相关控制器的引用

代码: 以下是如何通过UsersAdminController的initialize方法(正确)初始化gridpane:

public void initialize(URL location, ResourceBundle resources) {
    gridPaneNonSudoUsers = new GridPane();
    gridPaneNonSudoUsers.setId("gridPaneNonSudoUsers");
    // setting column widths for the grid pane
    gridPaneNonSudoUsers.getColumnConstraints().add(new ColumnConstraints(145));
    gridPaneNonSudoUsers.getColumnConstraints().add(new ColumnConstraints(85));
    gridPaneNonSudoUsers.getColumnConstraints().add(new ColumnConstraints(210));
    gridPaneNonSudoUsers.getColumnConstraints().add(new ColumnConstraints(150));

    srcPaneUsers.setContent(gridPaneNonSudoUsers);
    gridPaneNonSudoUsers.setAlignment(Pos.CENTER);

    displayNonSudoUsers(getSystemNonSudoUsers());
}
下面是填充GridPane的displayNonSudoUsers

公共无效显示非自定义项(ArrayList非自定义项){

在此代码中:

public void initialize(URL location, ResourceBundle resources) {
    // need to access UsersAdminController to update users list 
    // when adding user
    URL loc = getClass().getResource("/resources/fxml/UsersAdminPane.fxml"); // the UsersAdmin fxml 
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(loc);
    fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
    try {
        Parent root = (Parent) fxmlLoader.load(loc.openStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    uac = (UsersAdminController)fxmlLoader.getController();
}
加载
UsersAdminPane.fxml
的新副本,获取对其控制器的引用…然后放弃视图(
root
),并且从不对其执行任何操作。由于该视图从未显示,因此在控制器上调用方法永远不会产生任何更新


您需要获取与现有视图关联的控制器的引用,并对其调用方法,而不是创建新的控制器。假设您从
UsersAdminController
加载AddUser fxml文件,您可以从
fxmloader
获取
AddUserController
,并将引用传递给
用户rsAdminController
通过定义
setUsersAdminController(…)
AddUserController

中的
方法如何获取
AddUserController
中对
UserAdministrationController
的引用?在编辑中回答您正在AddUserController中加载一个全新的UsersAdminPane?还没有吗?您的代码非常复杂,很难完成o弄清楚发生了什么。我建议您完全从头开始创建一个新的应用程序,其中包括一个控制器调用另一个控制器来更新其关联视图。除此之外,请尽可能简单。一旦您掌握了使其工作的技术,您可以尝试修复您的真实应用程序。如果我不这样做
Parent root=(Parent)fxmloader.load(loc.openStream());
当我试图访问
uac
时,我得到了一个NullPointerException。你可能是对的,我没有意识到。假设我有一个与UsersAdminPane.fxml现有视图相关的阶段的引用,你对如何访问相应的控制器有什么建议吗?非常感谢你的时间。请参阅更新。另请参阅
    public void createUser() throws UserCreationException {

        String username, password1, password2;
        username = txtUsername.getText();
        password1 = txtPassword1.getText();
        password2 = txtPassword2.getText();
        LinuxCommand lc = new LinuxCommand(System.getProperty("user.dir")+"/adduser.sh", username, password2);
    Task<Void> task = new Task<Void>() {
        @Override
        public Void call() throws Exception {
            lc.execute();
            return null;
        }
    };
    task.setOnFailed(new EventHandler<WorkerStateEvent>() {
        public void handle(WorkerStateEvent t) {
            System.out.println("FAILURE creating  " + username);
            System.out.println("exit code: " + lc.getExitCode());
        }
    });
    task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
        @Override
        public void handle(WorkerStateEvent t) {
            if (lc.getExitCode() != 0)
                // show dialog
                return;
            System.out.println("Successfully created new user:  " + username + " With exit code: " + lc.getExitCode());
            Platform.runLater(new Task<Void>() {
                @Override
                public Void call() throws Exception {                       
                    uac.addUser();          
                    return null;

                }
            });
        }
    });

    executorUserCreation.submit(task);
public void initialize(URL location, ResourceBundle resources) {
    // need to access UsersAdminController to update users list 
    // when adding user
    URL loc = getClass().getResource("/resources/fxml/UsersAdminPane.fxml"); // the UsersAdmin fxml 
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(loc);
    fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
    try {
        Parent root = (Parent) fxmlLoader.load(loc.openStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    uac = (UsersAdminController)fxmlLoader.getController();
}
public void initialize(URL location, ResourceBundle resources) {
    // need to access UsersAdminController to update users list 
    // when adding user
    URL loc = getClass().getResource("/resources/fxml/UsersAdminPane.fxml"); // the UsersAdmin fxml 
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(loc);
    fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
    try {
        Parent root = (Parent) fxmlLoader.load(loc.openStream());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    uac = (UsersAdminController)fxmlLoader.getController();
}