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