禁用JavaFXML中另一个控制器的按钮

时间:2018-08-30 18:10:58

标签: java javafx scenebuilder netbeans-platform

我正在一个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");
        }


    }
}}

1 个答案:

答案 0 :(得分:0)

您两次加载场景:

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。通常,这比检查多个节点中的哪一个是事件的源头更好。