Основная проблема в том, что
FXMLLoader firstLoader = new FXMLLoader();
firstLoader.setLocation(getClass().getResource("FXMLDocument.fxml"));
вы на самом деле создаете новый FXMLLoader
, а не получаете ссылку на открытый.
Вы можете получить ссылку на open FXMLLoader
, например, используя статические элементы (см. здесь ), но было бы лучше использовать немного другой подход:
FXMLDocumentController.java
public class FXMLDocumentController implements Initializable {
@FXML
private Button button;
@FXML
private StackPane myStackPane;
private Label label = new Label("Text 1");
@FXML
private void handleButtonAction(ActionEvent event) {
FXMLLoader secondLoader = new FXMLLoader();
secondLoader.setLocation(getClass().getResource("FXMLSecond.fxml"));
try {
secondLoader.load();
} catch (IOException e) {e.printStackTrace(); }
FXMLSecondController secondController = secondLoader.getController();
//secondController.setFieldText(label.getText());
secondController.setTextProperty(label.textProperty());
Parent p = secondLoader.getRoot();
Stage stage = new Stage();
stage.setScene(new Scene(p));
stage.showAndWait();
myStackPane.getChildren().add(label);
}
/*
public void putLabelOnStackPane(String value) {
label.setText(value);
myStackPane.getChildren().add(label);
}*/
@Override
public void initialize(URL url, ResourceBundle rb) { //no need to implement Initializable
//if initialize not used
}
}
FXMLSecondController.java
public class FXMLSecondController implements Initializable {
@FXML
private Button saveText;
@FXML
private TextField textField;
private StringProperty labelStringProperty;
@Override
public void initialize(URL url, ResourceBundle rb) {
textField.setEditable(true);
}
@FXML
private void saveTextBtnPressed(ActionEvent event) {
/** By doing so you actually construct a new FXMLDocument
FXMLLoader firstLoader = new FXMLLoader();
firstLoader.setLocation(getClass().getResource("FXMLDocument.fxml"));
try {
firstLoader.load();
} catch (IOException e) {
}
FXMLDocumentController firstController = firstLoader.getController();
firstController.putLabelOnStackPane(textField.getText());
*/
labelStringProperty.set(textField.getText());
Stage stage = (Stage) saveText.getScene().getWindow();
stage.close();
}
/*
public void setFieldText(String value) {
textField.setText(value);
}*/
public void setTextProperty(StringProperty labelStringProperty) {
this.labelStringProperty = labelStringProperty;
textField.setText(labelStringProperty.get());
}
}
Также рассмотрите возможность использования Dialog для ввода.
EDIT
Чтобы FXMLSecondController
добавить метку к FXMLDocoment
, измените FXMLDocumentController
, чтобы передать необходимые ссылки на FXMLSecondController
:
public class FXMLDocumentController {
@FXML
private Button button;
@FXML
private StackPane myStackPane;
private Label label = new Label("Text 1");
@FXML
private void handleButtonAction(ActionEvent event) {
FXMLLoader secondLoader = new FXMLLoader();
secondLoader.setLocation(getClass().getResource("FXMLSecond.fxml"));
try {
secondLoader.load();
} catch (IOException e) {e.printStackTrace(); }
FXMLSecondController secondController = secondLoader.getController();
secondController.setRefrences(myStackPane.getChildren(), label);
Parent p = secondLoader.getRoot();
Stage stage = new Stage();
stage.setScene(new Scene(p));
stage.showAndWait();
}
}
И FXMLSecondController
используйте эти ссылки:
public class FXMLSecondController {
@FXML
private Button saveText;
@FXML
private TextField textField;
private ObservableList<Node> children;
private Label label;
@FXML
private void saveTextBtnPressed(ActionEvent event) {
label.setText(textField.getText());
children.add(label);
Stage stage = (Stage) saveText.getScene().getWindow();
stage.close();
}
public void setRefrences(ObservableList<Node> children, Label label) {
this.children = children;
this.label = label;
textField.setText(label.getText());
}
}