【问题标题】:How to create multiple instantiations of one fxml file如何创建一个 fxml 文件的多个实例化
【发布时间】:2019-07-02 08:53:43
【问题描述】:

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

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

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

提前致谢

编辑

我正在处理这个想法的代码在这里:

JavaFX : Pass parameters while instantiating controller class

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

我有一个场景,我想保存我制作的 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 文件的多个副本”,请发布您的代码的 minimal reproducible example。 “但只有一个控制器”有一个控制器类,但每个fxml 都应该有它自己的实例。

标签: java javafx fxml


【解决方案1】:

以下演示如何构造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();
}

【讨论】:

  • 我明白了,所以每次都是新的 fxml 加载器,这就是我所缺少的。如果有 10 多个或更多实例怎么办?从设计或效率的角度来看,您有什么不同的做法吗?
  • 如果有很多实例,您可能会侵占 UI 虚拟化。这是ListViewexampleTableView 和其他使用虚拟化的节点也可以这样做。
  • 谢谢@Sedrick,你教会了我一些新东西。这个项目不会有那么多条目,可能最多 20 个。我上面的评论是问我是否确实有 20 个实例,我将有 20 个控制器来跟上以对标签进行更改。这是好设计吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多