2016-01-17 8 views
4

Я не могу задать текст текстового поля. Ошибка отсутствует, но текстовое поле по-прежнему пуст. Остальная часть программы работает, метод вызывается, а System.out.println (...) печатает правильный текст. Таким образом, проблема заключается в том, что текст текстового поля не может быть установлен. Даже если я просто напишу textField.setText («0»); текстовое поле по-прежнему пуст. Когда я устанавливаю текст для текстового поля под public void initialize (...), он также работает. Так почему же он не работает в setCurrentInfo?JavaFX - setText() не работает

@FXML 
private TextField textField; 

private Info currentInfo; 

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

public void setCurrentInfo(Info currentInfo) { 
    textField.setText(currentInfo.getpw1()); 
    System.out.println(currentInfo.getpw1()); 
    this.currentInfo = currentInfo; 
} 

Часть контроллера, где setCurrentInfo называется:

@FXML 
private void handleBtn1(ActionEvent event) throws Exception{ 
    Info info = new Info(textFieldA.getText(), textFieldB.getText()); 
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("FXMLPassword.fxml")); 
    loader.load(); 
    Stage stage; 
    Parent root; 
    if(event.getSource()==btn1){ 
     //get reference to the button's stage   
     stage=(Stage) btn1.getScene().getWindow(); 
     //load up OTHER FXML document 
     root = FXMLLoader.load(getClass().getResource("FXMLPassword.fxml")); 
    } 
    else{ 
     stage=(Stage) btn1.getScene().getWindow(); 
     root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
    } 
    //create a new scene with root and set the stage 
    Scene scene = new Scene(root); 
    stage.setScene(scene); 
    stage.show(); 
    FXMLPasswordController passwordController = loader.getController(); 
    passwordController.setCurrentInfo(info); 
    } 
+0

Где вы звоните 'setCurrentInfo (...)' от? Можете ли вы включить код, в котором вы его вызываете в вопросе? –

+0

с другого контроллера. Но его определенно называли иначе, что Println не напечатал правильный текст. – Nik

+0

Вы называете это экземпляром этого контроллера, созданного «FXMLLoader»? Это действительно помогло бы диагностировать проблему, если бы вы [отредактировали] вопрос и включили код, вызывающий метод, в том числе, как вы получите ссылку на контроллер. –

ответ

3

Вы запрашиваете контроллер от неправильного FXMLLoader. В частности, вы делаете:

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource("FXMLPassword.fxml")); 
loader.load(); 

, а затем позже

FXMLPasswordController passwordController = loader.getController(); 

В этом коде, вы создаете FXMLLoader и направьте его в файл FXMLPassword.fxml. Но когда вы вызываете loader.load(), который читает файл fxml и создает определенный в нем пользовательский интерфейс, вы ничего не делаете с результатом. Таким образом, пользовательский интерфейс, созданный этим вызовом до loader.load(), никогда не отображается.

Следовательно, когда вы получаете контроллер от loader и используете его для внесения изменений в пользовательский интерфейс, вы никогда не увидите эти изменения, потому что этот экземпляр TextField не отображается.

TextField, который отображается создается при вызове

root = FXMLLoader.load(getClass().getResource("FXMLPassword.fxml")); 

, но так как вы используете статическую версию метода FXMLLoader.load(...) здесь, у вас нет возможности получить контроллер, связанный с ним.

Вам нужно реорганизовать код следующим образом:

@FXML 
private void handleBtn1(ActionEvent event) throws Exception{ 
    Info info = new Info(textFieldA.getText(), textFieldB.getText()); 
    Stage stage; 
    Parent root; 
    if(event.getSource()==btn1){ 
     //get reference to the button's stage   
     stage=(Stage) btn1.getScene().getWindow(); 
     //load up OTHER FXML document 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(getClass().getResource("FXMLPassword.fxml")); 
     root = loader.load(); 
     FXMLPasswordController passwordController = loader.getController(); 
     passwordController.setCurrentInfo(info); 
    } 
    else{ 
     stage=(Stage) btn1.getScene().getWindow(); 
     root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
    } 
    //create a new scene with root and set the stage 
    Scene scene = new Scene(root); 
    stage.setScene(scene); 
    stage.show(); 
} 
+0

Спасибо! Оно работает. – Nik