Как создать несколько экземпляров одного файла FXML - PullRequest
0 голосов
/ 08 февраля 2019

Простой вопрос, но я не могу найти ответ.У меня есть один файл FXML, который я хотел бы создать несколько раз.У каждой копии должен быть свой дескриптор, чтобы я мог изменить в нем данныеГипотетически это похоже на использование ключевого слова «new» в только что созданном классе.

В моих попытках я смог создать несколько копий файла fxml, но есть только один контроллер, поэтому вызов методов означает, что изменения происходят со всеми копиями.

Нужно ли создавать новый контроллер для каждой копии одного и того же файла fxml?

Заранее спасибо

РЕДАКТИРОВАТЬ

Код, с которым я работаюэта идея изложена здесь:

JavaFX: передать параметры при создании экземпляра класса контроллера

На всякий случай может помочь какой-то фон:

У меня естьСцена, в которой я хочу хранить несколько экземпляров файла FXML, который я сделал.Установить один файл FXML в сцене легко, но создание нескольких (10-20) означает, что у меня будет от 10 до 20 контроллеров и от 10 до 20 экземпляров файла FXML.Есть ли более чистый способ сделать это?

Я надеялся сделать что-то вроде этого:

public class SampleController implements Initializable {

    @FXML
    Label firstName;

    @FXML
    Label lastName;

    public SampleController(Label firstname, Label lastname) {

        this.firstName = firstname;
        this.lastName = lastname;
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }
}

Затем вызвать что-то вроде:

SampleController Row1 = new SampleController("my", "name");

и получить этоКоманда загружает прикрепленный файл FXML на сцену вместе с данными, которые я передал.Но это не работает, вылетает за исключением.

1 Ответ

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

Демонстрация создания двух экземпляров файла fxml и получение ссылки на их контроллеры:

Main.fxml

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller">
   <children>
      <Label fx:id="label" />
   </children>
   <opaqueInsets>
      <Insets top="10.0" />
   </opaqueInsets>
 </Pane>

Controller.java его контроллер

import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class Controller{

    @FXML
    public Label label;

    public void setText(String text) {
        label.setText(text);
    }
}

Используйте два экземпляра Main.fxml:

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

    FXMLLoader loader = new FXMLLoader();
    Pane topPane  =  loader.load(getClass().getResource("xml/Main.fxml").openStream());
    Controller controllerOfTop = loader.getController();
    controllerOfTop.setText("Top");

    loader = new FXMLLoader();
    Pane bottomPane  =  loader.load(getClass().getResource("xml/Main.fxml").openStream());
    Controller controllerOfBottom = loader.getController();
    controllerOfBottom.setText("Bottom");

    Scene scene = new Scene(new VBox(topPane, bottomPane));
    primaryStage.setScene(scene);
    primaryStage.show();
}
...