从一个FXML文件到另一个文件从TextField获取用户输入

时间:2016-05-05 10:56:22

标签: java javafx

其他线程也很少有类似问题,但我尝试实现这些答案中给出的代码,但到目前为止我没有成功。我将提供我的代码的显着部分。我有两个FXML文件LoginFXMLDockFXML以及一个TextField tfUsername。我想将用户在tfUsername中输入的输入作为StringLoginFXML传递到DockFXML

我将在下面的示例中删除不必要的代码。

LoginFXMLController

public class LoginFXMLController implements Initializable {

    @FXML
    private TextField tfUsername;

    private void animateWhenLoginSuccess(){
            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(getClass().getResource("DockFXML.fxml"));
            Parent main = fxmlLoader.load();
            DockFXMLController c = (DockFXMLController) fxmlLoader.getController();
            c.loginUsername = tfUsername.getText();
//        Print below works which means that a String is okay
            System.out.println(c.loginUsername);
    }

    @FXML
    private boolean loginSuccessful() throws SQLException{

//        Login check in MySQL
    }
}

DockFXMLController

public class DockFXMLController implements Initializable {

    @FXML
    private Label lblName;

    public String loginUsername;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        lblName.setText(loginUsername);
    }    
}

因此,我希望在此示例中获得的输出是显示用户在LoginFXML中输入的内容,并在Label lblName中的DockFXML上显示。

1 个答案:

答案 0 :(得分:0)

initialize()方法在加载fxml文件的过程中被调用。这意味着行

lblName.setText(loginUsername);
DockFXMLController中的

在行

之前执行
c.loginUsername = tfUsername.getText();
LoginFXMLController中的

您需要使用set方法,以便在设置loginUserName时更新标签:

public class DockFXMLController implements Initializable {

    @FXML
    private Label lblName;

    private String loginUsername;

    public String getLoginUserName() {
        return loginUserName ;
    }

    public void setLoginUserName(String userName) {
        loginUserName = userName ;
        lblName.setText(loginUsername);
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }    
}

然后你做

private void animateWhenLoginSuccess(){
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getResource("DockFXML.fxml"));
        Parent main = fxmlLoader.load();
        DockFXMLController c = (DockFXMLController) fxmlLoader.getController();
        c.setLoginUsername(tfUsername.getText());
}

请注意,实际变量loginUsername现在非常多余:您可以执行

public class DockFXMLController implements Initializable {

    @FXML
    private Label lblName;

    public String getLoginUserName() {
        return lblName.getText() ;
    }

    public void setLoginUserName(String userName) {
        lblName.setText(userName);
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {

    }    
}

你甚至可以通过添加方法来公开完整属性(这将允许你注册监听器并创建绑定)

    public StringProperty loginUserNameProperty() {
        return lblName.textProperty();
    }

(这些都不会改变上面的LoginController代码。)