Как я могу получить TextField из внутренней стадии в JavaFX?

Я написал контроллер для двух окон / этапов. Первое окно открывается в MainClass. Второй в контроллере, если пользователь нажимает на кнопку. Как я могу получить TextFields из second.fxml в методе applyFor ()?

Благодарю.

@FXML
    protected void requestNewAccount(ActionEvent event) {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("second.fxml")); // TextFields in there
            Parent root = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setTitle("Second Window");
            Scene scene = new Scene(root);
            String css = MainOnlineCustomer.class.getResource("/style.css").toExternalForm();
            scene.getStylesheets().clear();
            scene.getStylesheets().add(css);
            stage.setScene(scene);
            stage.show();
        } catch (IOException e) {
            logger.error(e);
        }
    }

    /**
     * closes the "second"-Window
     * @param event
     */
    @FXML
    protected void cancel(ActionEvent event) {
        final Node source = (Node) event.getSource();
        final Stage stage = (Stage) source.getScene().getWindow();
        stage.close();
    }

    @FXML
    protected void applyFor(ActionEvent event) {
        // get values from TextField in second.fxml here!!!
    }
 Olantobi28 июн. 2016 г., 00:31
Свяжите кнопку действия с методом applyFor и установите Id для TextField из second.fxml.

Ответы на вопрос(1)

Решение Вопроса

Не стоит делить контроллеры между fxmls, если они не служат одной и той же цели. Здесь оба fxml, кажется, служат разным целям (управление учетной записью, логин или что-то подобное для одного из них и создание новой учетной записи для другого). Еще хуже то, что эти классы не используют один и тот же экземпляр контроллера, что означает, что небольшое (и, вероятно, единственное) преимущество, которое вы могли бы получить от использования того же контроллера, здесь не используется. Вам лучше использовать разные контроллеры.

Так как вы используетеModality.APPLICATION_MODAL в качестве модальности я бы рекомендовал использоватьshowAndWait вместоshow открыть новый этап. Это войдет во вложенный цикл обработки событий, который позволяет интерфейсу пользователя оставаться отзывчивым и продолжается после вызоваshowAndWait как только сцена закрыта.

Кроме того, добавьте метод в контроллерsecond.fxml это позволяет вам получить результат.

пример

Это создаетPerson объект с указанным именем и фамилией.

«главное окно (открытие« внутренней »сцены)
FXMLLoader loader = new FXMLLoader(getClass().getResource("second.fxml"));
Stage subStage = new Stage();
subStage.initModality(Modality.APPLICATION_MODAL);
subStage.setTitle("Second Window");
Scene scene = new Scene(loader.load());
subStage.setScene(scene);
subStage.showAndWait();

Optional<Person> result = loader.<Supplier<Optional<Person>>>getController().get();

if (result.isPresent()) {
    // do something with the result
}
контроллер для «внутреннего» контента
public class SecondController implements Supplier<Optional<Person>> {
    @FXML
    private TextField givenName;
    @FXML
    private TextField familyName;

    private boolean submitted = false;

    // handler for submit action
    @FXML
    private void submit() {
        submitted = true;
        givenName.getScene().getWindow().hide();
    }

    // handler for cancel action
    @FXML
    private void cancel() {
        givenName.getScene().getWindow().hide();
    }

    @Override
    public Optional<Person> get() {
        return submitted ? Optional.of(new Person(givenName.getText(), familyName.getText())) : Optional.empty();
    }

}

Обратите внимание, что таким способом вы можете получить доступ к любым данным, доступным для контроллера. Я бы не рекомендовал доступ к каким-либо узлам (например,TextFields) напрямую, поскольку это усложняет изменение пользовательского интерфейса.

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

Ваш ответ на вопрос