Я рассмотрел предложения и не смог заставить что-либо работать на меня - многие концепции были у меня над головой, так как я новичок в Java. После нескольких попыток мне удалось получить довольно простое решение проблемы. Вероятно, это далеко от лучших практик, но это работает:
В контроллере основного окна используйте контроллер всплывающего окна для вызова строковой переменной всплывающего окна и установите его в качестве текста метки (label.setText (controller.test). )). Строковая переменная должна быть publi c и устанавливается после закрытия всплывающего окна нажатием кнопки. См. Код ниже:
Main.f xml:
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="switchingpass.MainController">
<children>
<Button fx:id="button" layoutX="126" layoutY="90" onAction="#popBtnClick" text="Click Me!" />
<Label fx:id="label2" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
<Label fx:id="label" layoutX="143.0" layoutY="38.0" text="Label" />
</children>
</AnchorPane>
MainController:
public class MainController implements Initializable {
@FXML
public Label label;
@FXML
private Button button;
@FXML
private void popBtnClick(ActionEvent event) throws IOException {
//creates new pop-up window
Stage popupSave = new Stage();
popupSave.initModality(Modality.APPLICATION_MODAL);
popupSave.initOwner(SwitchingPass.stage);
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("PopUp.fxml"));
Parent root = loader.load();
PopUpController controller = loader.getController();
Scene scene = new Scene(root);
popupSave.setScene(scene);
popupSave.showAndWait();
//after the popup closes, this will run, setting the label's text to the popup's test variable, which is public.
label.setText(controller.test);
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
PopUp.f xml:
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="switchingpass.PopUpController">
<children>
<TextField fx:id="input_tf" layoutX="207.0" layoutY="65.0" />
<Button fx:id="close_btn" layoutX="268.0" layoutY="185.0" mnemonicParsing="false" onAction="#closeBtnClick" text="Close" />
</children>
</AnchorPane>
PopUpController:
public class PopUpController implements Initializable {
@FXML
public Button close_btn;
@FXML
public TextField input_tf;
@FXML
public String test;
@FXML
private void closeBtnClick() throws IOException {
//stores textfield input as a string
test = input_tf.getText();
Stage stage = (Stage)input_tf.getScene().getWindow();
stage.close();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
Обратите внимание, что основной класс кода, расширяющий Application, должен объявить переменную stage как переменную c stati c:
public class SwitchingPass extends Application {
//this is necessary to initialize the owner of the popup
public static Stage stage;
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Опять же, возможно, не лучший способ выполнить это sh, но это работает, и, возможно, это полезно для кого-то еще.