Взаимодействие между контроллерами в JavaFX

241
14 апреля 2022, 22:30

Подскажите, пожалуйста, как правильно написать взаимодействие между двумя контроллерами.

У меня есть примитивный файловый менеджер, в котором есть два метода: mkdir, touch (создание папки / файла).

В основном окне есть соответственно 2 кнопки. При нажатии должно выскакивать новое простое окно с полем ввода, двумя кнопками "ok", "cancel".

Как правильно получить текст из поля ввода вылезающего окна основным контроллером?

Мой класс Controller

@FXML
Button mkdir;
@FXML
Button touch;
private void setActions() {
    SubController subController = new SubController();
    subController.start();
    mkdir.setOnAction(click -> {
        subController.show();
        dos.write(("mkdir " + "здесь должен быть текст, полученный из SubController").getBytes());
    });
    touch.setOnAction(click -> {
        subController.show();
        dos.write(("touch " + "здесь должен быть текст, полученный из SubController").getBytes());
    });
}

Мой класс SubController

private static Stage myStage;
private String text;
@FXML
Button subOk;
@FXML
Button subCancel;
@FXML
TextField subName;
public void start() {
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getClassLoader().getResource("SubWindow.fxml"));
        loader.setController(new SubController());
        VBox vBox = loader.load();
        myStage = new Stage();
        myStage.setTitle("Enter your text here");
        myStage.setScene(new Scene(vBox, 250, 50));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public void initialize() {
    subOk.setOnAction(click -> {
        text = subName.getText();
        subName.clear();
    });
    subCancel.setOnAction(click -> {
        subName.clear();
        myStage.hide();
    });
}
public void show() {
    myStage.show();
}
public void hide() {
    myStage.hide();
}
public String getText() {
    return text;
}

Выглядит это примерно так:

Answer 1

Если вам нужно простое окно с полем ввода, то воспользуйтесь тогда TextInputDialog. Ваш код тогда будет выглядеть примерно так:

mkdir.setOnAction(click -> {
    TextInputDialog dialog = new TextInputDialog();
    dialog.setTitle("Some title");
    textInputDialog.getDialogPane().setHeader(null);
    dialog.setContentText("Enter your text here:");
    Optional<String> result = dialog.showAndWait();
    if (result.isPresent()) {
        dos.write(("mkdir " + result.get());
    }
});

P.S. вот тут можете посмотреть еще примеры различные с диалогами

READ ALSO
Как делается фронтенд для Java-приложений?

Как делается фронтенд для Java-приложений?

Я столкнулся с тем, что не понимаю, как обычно реализуется фронт для Java-приложенияУ меня есть несколько предположений о том, как это может...

275
gradle to maven

gradle to maven

Есть какой-нибудь конвертор gradle файла в maven?

161
Как прервать нужный поток в Java?

Как прервать нужный поток в Java?

Разбираюсь с потоками, написал такой код:

190
Как рисовать на JLabel?

Как рисовать на JLabel?

Создаю программу гитарных аккордов в SwingВ программе реализовал картинку "гитарный гриф" на JLabel следующим образом:

353