其他线程也很少有类似问题,但我尝试实现这些答案中给出的代码,但到目前为止我没有成功。我将提供我的代码的显着部分。我有两个FXML文件LoginFXML
和DockFXML
以及一个TextField tfUsername
。我想将用户在tfUsername
中输入的输入作为String
从LoginFXML
传递到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
上显示。
答案 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
代码。)