0

Я осваиваю JavaFX и пишу небольшое приложения для рецептов. Столкнулся с проблемой вывода данных в форму при ее инициализации после срабатывания ивента.

У меня есть 2 контроллера:

  1. OptionsController
  2. RecipeController

В OptionsController отдается форма для импорта ссылки и последующего парсинга рецепта, которая уже, в свою очередь, обрабатывается в контроллере RecipeController. Я ожидаю, что после импорта приложение спарсит данные и отдаст в новое модальное окно с информацией о рецепте в ивенете того же RecipeController. Однако это не происходит, потому что инициализация проходит, как я понимаю, раньше, чем мне нужно. Как мне это исправить и заполнить форму данными до ее инициализации? Прилагаю код:

OptionsController

public class OptionsController {
private Stage stage;
private Scene scene;
private Parent root;
public Button favourites;
public Button addRecipe;
public Button myRecipes;
public Button completeImport;
private PovarParser parser = new PovarRecipeParser();


public void onImportButtonClicked(MouseEvent mouseEvent) throws IOException {
    root = new FXMLLoader(
            HelloApplication.class
                    .getResource("import-recipe.fxml")
    ).load();
    Stage stage  = new Stage();
    stage.initModality(Modality.APPLICATION_MODAL);
    Scene scene = new Scene(root);
    stage.setScene(scene);
    stage.setTitle("Импорт рецепта");
    stage.showAndWait();
}

public void onFavouritesButtonClicked(MouseEvent mouseEvent) {
}

public void onAddRecipeButtonClicked(MouseEvent mouseEvent) {
}

public void onMyRecipesButtonClicked(MouseEvent mouseEvent) {
}


@FXML
void initialize() {
}

}

RecipeController

public class RecipeController {
public TextArea targetUrl;
private Stage stage;
private Scene scene;
private Parent root;

@FXML
public Label title;
PovarParser parser = new PovarRecipeParser();

RecipeModel recipeModel = new RecipeModel();



public void onCompleteImportClicked(MouseEvent event) throws IOException {
    title = new Label(recipeModel.getTitle());
    String recipeLink = targetUrl.getText();
    if (PovarValidator.isValidUrl(recipeLink)){
        recipeModel = parser.parse(recipeLink);
    }
    root = new FXMLLoader(
            HelloApplication.class
                    .getResource("recipe.fxml")
    ).load();

    //author.setText(recipeModel.getAuthor());
    stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
    scene = new Scene(root);
    stage.setScene(scene);
}

@FXML
void initialize() {
}

}

import-recipe.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.?> <?import javafx.scene.layout.?> <?import javafx.scene.text.*?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0" prefWidth="500.0" style="-fx-border-radius: 10; -fx-background-color: #fbf67f;" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ru.martynova.recipemanager.controller.RecipeController" > <children> <TextArea fx:id="targetUrl" layoutX="96.0" layoutY="80.0" prefHeight="15.0" prefWidth="295.0" style="-fx-border-radius: 15;" /> <Button fx:id="completeImport" layoutX="190.0" layoutY="134.0" mnemonicParsing="false" onMouseClicked="#onCompleteImportClicked" prefHeight="27.0" prefWidth="108.0" style="-fx-background-color: #dd8600;" text="Импортировать" /> <Label layoutX="56.0" layoutY="28.0" text="Импорт осуществляется по ссылке на страницу рецепта с сайта "> <font> <Font name="SansSerif Bold" size="12.0" /> </font> </Label> <Hyperlink layoutX="181.0" layoutY="43.0" text="https://povar.ru/"> <font> <Font name="SansSerif Italic" size="15.0" /> </font> </Hyperlink> </children> </Pane>

recipe.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?> <?import javafx.scene.control.ScrollPane?> <?import javafx.scene.image.ImageView?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.RowConstraints?> <?import javafx.scene.shape.Line?> <?import javafx.scene.text.Font?> <?import javafx.scene.text.Text?>

<ScrollPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="493.0" prefWidth="601.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ru.martynova.recipemanager.controller.OptionsController" > <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="579.0" prefWidth="598.0"> <Label fx:id="title" layoutX="144.0" layoutY="14.0" prefHeight="63.0" prefWidth="310.0" text="Label" textAlignment="CENTER"> <font> <Font name="SansSerif Bold" size="14.0" /> </font> </Label> <ImageView fitHeight="249.0" fitWidth="372.0" layoutX="113.0" layoutY="77.0" pickOnBounds="true" preserveRatio="true" /> <Line endX="195.0" layoutX="289.0" layoutY="340.0" startX="-177.00001525878906" /> <GridPane layoutX="326.0" layoutY="350.0" prefHeight="40.0" prefWidth="257.0"> <columnConstraints> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> </columnConstraints> <rowConstraints> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> </rowConstraints> <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Автор:" wrappingWidth="104.4388427734375" /> <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Время приготовления:" textAlignment="CENTER" GridPane.rowIndex="1" /> <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text" GridPane.columnIndex="1" /> <Text fx:id="timeToCook" strokeType="OUTSIDE" strokeWidth="0.0" text="Text" GridPane.columnIndex="1" GridPane.rowIndex="1" /> </GridPane> </AnchorPane> </ScrollPane>

0 Answers0