Несколько файлов FXML с контроллерами для каждого файла - TextArea неправильно отображает текст после добавления - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу разделить свой FXML на более мелкие файлы, каждый из которых имеет свой собственный контроллер.В основном я создаю экземпляр для каждого контроллера и получаю доступ к textAreaSample и пытаюсь добавить текст.Я не вижу, что текст меняется.Зачем?Alert отображает текст с этого TextArea:

alert.setContentText(textAreaSample.getText());

Я не знаю, как установить все fxml-файлы и контроллеры.Как мне все это установить?

Вот мой основной файл `sample.fxml ':

<GridPane fx:controller="sample.ControllerSample"
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">

    <fx:include fx:id="sending" source="Sending.fxml" GridPane.columnIndex="0" GridPane.rowIndex="0"/>

    <TextArea fx:id="textAreaSample" prefWidth="200" prefHeight="200"
          GridPane.columnIndex="1" GridPane.rowIndex="0" text="Sample">
    </TextArea>
</GridPane>

и его контроллер:

public class ControllerSample {

    @FXML
    private TextArea textAreaSample;

    public ControllerSample() {}

    public TextArea getTextAreaSample() {
        return textAreaSample;
    }

    public void setTextAreaSample(TextArea textAreaSample) {
        this.textAreaSample = textAreaSample;
    }
}

Теперь у меня естьSending.fxml файл:

<GridPane fx:controller="sample.ControllerSending"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">

        <fx:include fx:id="sendingPhotos" source="SendingPhotos.fxml" GridPane.columnIndex="0" GridPane.rowIndex="0"/>
</GridPane>

и его контроллер:

public class ControllerSending {

    public ControllerSending() {}
}

Вот SendingPhotos.fxml код:

<TextArea xmlns="http://javafx.com/javafx"
      xmlns:fx="http://javafx.com/fxml"
      fx:controller="sample.ControllerSendingPhotos" fx:id="textAreaSendingPhotos" prefWidth="200" prefHeight="200"
      text="Photos"/>

и контроллер:

public class ControllerSendingPhotos {

    @FXML
    private TextArea textAreaSendingPhotos;

    public ControllerSendingPhotos() {}

    public TextArea getTextAreaSendingPhotos() {
        return textAreaSendingPhotos;
    }

    public void setTextAreaSendingPhotos(TextArea textAreaSendingPhotos) {
        this.textAreaSendingPhotos = textAreaSendingPhotos;
    }
}

Сейчас Main.java код:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        FXMLLoader loaderSample = new FXMLLoader(getClass().getResource("sample.fxml"));
        FXMLLoader loaderSending = new FXMLLoader(getClass().getResource("Sending.fxml"));
        FXMLLoader loaderSendingPhotos = new FXMLLoader(getClass().getResource("SendingPhotos.fxml"));

        loaderSample.load();
        loaderSending.load();
        loaderSendingPhotos.load();

        ControllerSample controllerSample = (ControllerSample) loaderSample.getController();
        ControllerSending controllerSending = (ControllerSending) loaderSending.getController();
        ControllerSendingPhotos controllerSendingPhotos = (ControllerSendingPhotos) loaderSendingPhotos.getController();

        TextArea textAreaSample = controllerSample.getTextAreaSample();
        textAreaSample.setText("\ndebug textAreaSample\n");

        Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "");

        alert.setContentText(textAreaSample.getText());
        alert.showAndWait();

        //TextArea textAreaSendingPhotos = controllerSendingPhotos.getTextAreaSendingPhotos();
        //textAreaSendingPhotos.appendText("\ndebug textAreaSendingPhotos\n");

        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 800, 400));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Редактировать: я определяю ControllerSending в ControllerSample с помощью геттеров и сеттеров?А потом в ControllerSending я определяю ControllerSendingPhoto с геттерами и сеттерами?А затем в Main, чтобы объявить ControllerSendingPhotos Я использую controllerSample.getControllerSending().getControllerSendingPhotos()?

1 Ответ

0 голосов
/ 25 февраля 2019

Чтобы получить доступ к textArea во вложенном fxml, вы должны изменить контроллеры:

public class ControllerSample {
    @FXML
    private TextArea textAreaSample;

    @FXML
    private ControllerSending sendingController;

    public ControllerSample() {
    }

    public TextArea getTextAreaSample() {
        return textAreaSample;
    }

    public void setTextAreaSample(TextArea textAreaSample) {
        this.textAreaSample = textAreaSample;
    }

    protected ControllerSending getSendingController() {
        return sendingController;
    }
}

public class ControllerSending {
    @FXML
    private ControllerSendingPhotos sendingPhotosController;

    public ControllerSending() {
    }

    protected ControllerSendingPhotos getSendingPhotosController() {
        return sendingPhotosController;
    }
}

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        FXMLLoader loaderSample = new FXMLLoader(getClass().getResource("sample.fxml"));

        Parent root = loaderSample.load();

        ControllerSample controllerSample = (ControllerSample) loaderSample.getController();

        TextArea textAreaSample = controllerSample.getTextAreaSample();
        textAreaSample.setText("\ndebug textAreaSample\n");

        TextArea textAreaSendingPhotos = controllerSample.getSendingController().getSendingPhotosController()
            .getTextAreaSendingPhotos();
        textAreaSendingPhotos.setText("test test test");

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 800, 400));
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}
...