在 Java FXML 中禁用来自另一个控制器的按钮
Disabling a button from another controller in JavaFXML
我正在开发一个 netbeansIDE javaFXML 项目,当我使用用户名和密码登录到第二个屏幕时,我希望禁用第二个屏幕按钮。我试图通过使用 Getter 来禁用另一个控制器中的按钮,但是当我登录时没有任何反应。
我真的希望能有所帮助,我试图搜索帮助并找到了一些,并尝试但以这个结束,现在我被困住了。
这是我的代码:
{@FXML
private void handleLogin(ActionEvent event) throws IOException {
String username = txtUsername.getText();
String password = txtPassword.getText();
Button pressed_button = (Button) event.getSource();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("Screen3_Scada.fxml"));
loader.load();
if(pressed_button==btnscadalogin){
if (loginLoad.validateSCADA(username, password)) {
try {
AnchorPane pane = FXMLLoader.load(getClass().getResource("Screen3_Scada.fxml"));
RootPane.getChildren().setAll(pane);
Screen3_Scada_Controller getbtnPLC = loader.getController();
getbtnPLC.getBtngotoPLC().setDisable(true);
}catch (IOException ex) {
System.err.println("Error in method GotoScreen2 class FXML_Screen1_loginController");
}
}else{
System.err.println("Error, wrong username or password");
}
}
}}
您正在加载场景两次:
loader.load();
...
AnchorPane pane = FXMLLoader.load(getClass().getResource("Screen3_Scada.fxml"));
getbtnPLC
不是加载场景时创建的控制器实例,您添加到现有场景中。
您应该使用作为 loader.load();
调用结果的加载结果:
if (pressed_button == btnscadalogin) {
if (loginLoad.validateSCADA(username, password)) {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("Screen3_Scada.fxml"));
try {
AnchorPane pane = loader.load();
RootPane.getChildren().setAll(pane);
Screen3_Scada_Controller getbtnPLC = loader.getController();
getbtnPLC.getBtngotoPLC().setDisable(true);
} catch (IOException ex) {
System.err.println("Error in method GotoScreen2 class FXML_Screen1_loginController");
}
}
我确实建议使用不同的方法来处理来自不同来源的 ActionEvent
。这通常比检查多个节点中的哪一个是事件源更好。
我正在开发一个 netbeansIDE javaFXML 项目,当我使用用户名和密码登录到第二个屏幕时,我希望禁用第二个屏幕按钮。我试图通过使用 Getter 来禁用另一个控制器中的按钮,但是当我登录时没有任何反应。 我真的希望能有所帮助,我试图搜索帮助并找到了一些,并尝试但以这个结束,现在我被困住了。
这是我的代码:
{@FXML
private void handleLogin(ActionEvent event) throws IOException {
String username = txtUsername.getText();
String password = txtPassword.getText();
Button pressed_button = (Button) event.getSource();
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("Screen3_Scada.fxml"));
loader.load();
if(pressed_button==btnscadalogin){
if (loginLoad.validateSCADA(username, password)) {
try {
AnchorPane pane = FXMLLoader.load(getClass().getResource("Screen3_Scada.fxml"));
RootPane.getChildren().setAll(pane);
Screen3_Scada_Controller getbtnPLC = loader.getController();
getbtnPLC.getBtngotoPLC().setDisable(true);
}catch (IOException ex) {
System.err.println("Error in method GotoScreen2 class FXML_Screen1_loginController");
}
}else{
System.err.println("Error, wrong username or password");
}
}
}}
您正在加载场景两次:
loader.load();
...
AnchorPane pane = FXMLLoader.load(getClass().getResource("Screen3_Scada.fxml"));
getbtnPLC
不是加载场景时创建的控制器实例,您添加到现有场景中。
您应该使用作为 loader.load();
调用结果的加载结果:
if (pressed_button == btnscadalogin) {
if (loginLoad.validateSCADA(username, password)) {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("Screen3_Scada.fxml"));
try {
AnchorPane pane = loader.load();
RootPane.getChildren().setAll(pane);
Screen3_Scada_Controller getbtnPLC = loader.getController();
getbtnPLC.getBtngotoPLC().setDisable(true);
} catch (IOException ex) {
System.err.println("Error in method GotoScreen2 class FXML_Screen1_loginController");
}
}
我确实建议使用不同的方法来处理来自不同来源的 ActionEvent
。这通常比检查多个节点中的哪一个是事件源更好。