JavaFX:无法自动更新GridPane
好吧,这是一个棘手的问题,已经让我发疯好几天了 我有两个阶段: 用户管理阶段(控制器:UsersAdminController.java) 具有以下元素层次结构: 用户添加阶段:(Controller:AddUserController.java) 作为users admin阶段(参见elements hierarchy)上部锚定窗格滚动窗格的子级,我在UsersAdminController初始化期间添加了一个GridPane,用于列出系统的用户,如所述 当我通过用户添加屏幕添加用户时,我会尝试更新用户管理阶段的GridPane,方法是获取对UsersAdminController的引用,然后调用更新其内容的方法。 但是,无法更新GridPane。(我似乎无法对滚动窗格和gridpane执行任何与gui相关的操作,尽管我设法获得了对相关控制器的引用 代码: 以下是如何通过UsersAdminController的initialize方法(正确)初始化gridpane:JavaFX:无法自动更新GridPane,javafx,scrollpane,gridpane,Javafx,Scrollpane,Gridpane,好吧,这是一个棘手的问题,已经让我发疯好几天了 我有两个阶段: 用户管理阶段(控制器:UsersAdminController.java) 具有以下元素层次结构: 用户添加阶段:(Controller:AddUserController.java) 作为users admin阶段(参见elements hierarchy)上部锚定窗格滚动窗格的子级,我在UsersAdminController初始化期间添加了一个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();
}