2016-05-05 73 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

相關問題