2016-05-05 38 views
0

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

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

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 in DockFXML

回答

0

initialize()方法被称为加载fxml文件的过程的一部分。这意味着

lblName.setText(loginUsername); 
DockFXMLController

线

c.loginUsername = tfUsername.getText(); 
LoginFXMLController

之前执行的行。

你需要,当你设置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代码)甚至暴露充分性(这将允许您注册监听器和创建绑定,如果需要)。

+0

谢谢你。我完全忽略了之前调用initialize()方法的事实。我正在阅读有关'Properties'的内容,看起来好像可以更好地访问'loginUsername'并多次调用它,而无需每次都编辑'animateWhenLoginSuccess()'。有没有可能在这里使用它? – brajevicm

+0

我不知道您每次编辑animateWhenLoginSuccess()都意味着什么。我更新了一些稍微好一点的选项(包括公开第二个控制器的属性),但并不真正知道你在那里问什么。 –

+0

对不起,如果我不清楚。通过“编辑'每次animateWhenLoginSuccess()'我的意思是,当我想让我说可以显示一些数据库中的图像,我必须通过用户名来找到它,我必须'c.setProfileImage(tfUsername.getText ));'例如。不知道我的逻辑有没有好,但到目前为止(在你的帮助下)我可以使用用户名显示数据库中的姓和名。 – brajevicm

相关问题