Java 如何创建一个fxml文件的多个实例化

Java 如何创建一个fxml文件的多个实例化,java,javafx,fxml,Java,Javafx,Fxml,一个简单的问题,但我找不到答案。我有一个FXML文件,我想多次实例化。每个副本都需要自己的句柄,以便我可以更改其中的数据。假设,这与在刚创建的类上使用new关键字完全相同 到目前为止,在我的尝试中,我已经能够创建fxml文件的多个副本,但是只有一个控制器,因此调用方法意味着所有副本都会发生更改 我是否必须为同一fxml文件的每个副本创建一个新控制器 提前谢谢 编辑 我正在研究这个想法的代码如下: 以防万一,一些背景可能会有所帮助: 我有一个场景,我想保存我制作的FXML文件的多个实例。在场景中设

一个简单的问题,但我找不到答案。我有一个FXML文件,我想多次实例化。每个副本都需要自己的句柄,以便我可以更改其中的数据。假设,这与在刚创建的类上使用new关键字完全相同


到目前为止,在我的尝试中,我已经能够创建fxml文件的多个副本,但是只有一个控制器,因此调用方法意味着所有副本都会发生更改

我是否必须为同一fxml文件的每个副本创建一个新控制器

提前谢谢

编辑

我正在研究这个想法的代码如下:

以防万一,一些背景可能会有所帮助:

我有一个场景,我想保存我制作的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文件与我传递的数据一起加载到场景中。但这不起作用,它会出现异常崩溃。

演示如何构造fxml文件的两个实例,并获取对其控制器的引用:

Main.fxml

使用Main.fxml的两个实例:


演示如何构造fxml文件的两个实例,并获取对其控制器的引用:

Main.fxml

使用Main.fxml的两个实例:


在我迄今为止的尝试中,我已经能够创建fxml文件的多个副本,请发布您的代码。但是只有一个控制器有一个控制器类,但是每个fxml都应该有它自己的实例。到目前为止,在我的尝试中,我已经能够创建fxml文件的多个副本,请发布您的代码。但是只有一个控制器有一个控制器类,但是每个fxml都应该有它自己的实例。我明白了,所以每次都是一个新的fxml加载器,这就是我所缺少的。如果有10多个实例或者更多,会怎么样?从设计或效率的角度来看,有什么不同的做法吗?如果有很多实例,您可能会侵入UI虚拟化。这是一个列表视图。TableView和其他使用虚拟化的节点也可以做到这一点。谢谢@Sedrick,你教了我一些新东西。这个项目不会有那么多的条目,可能最多20个。我上面的评论是问如果我有20个实例,我会有20个控制器来跟上,以便对标签进行更改。这个设计好吗?我明白了,所以每次都是一个新的fxml加载器,这就是我所缺少的。如果有10多个实例或者更多,会怎么样?从设计或效率的角度来看,有什么不同的做法吗?如果有很多实例,您可能会侵入UI虚拟化。这是一个列表视图。TableView和其他使用虚拟化的节点也可以做到这一点。谢谢@Sedrick,你教了我一些新东西。这个项目不会有那么多的条目,可能最多20个。我上面的评论是问如果我有20个实例,我会有20个控制器来跟上,以便对标签进行更改。这个设计好吗?
<?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>
import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class Controller{

    @FXML
    public Label label;

    public void setText(String text) {
        label.setText(text);
    }
}
@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();
}