Я осваиваю JavaFX и пишу небольшое приложения для рецептов. Столкнулся с проблемой вывода данных в форму при ее инициализации после срабатывания ивента.
У меня есть 2 контроллера:
OptionsControllerRecipeController
В 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>