将自定义类型的FXML属性设置为自定义javafx组件的属性

将自定义类型的FXML属性设置为自定义javafx组件的属性,java,javafx,javafx-8,Java,Javafx,Javafx 8,我创建了自定义JavaFX组件,如中所述 如何将实体传递给组件? 我知道如何传递字符串-它只是。但是如何传递任意类的实例呢? 请注意,不要为此使用单例模式。问题的解决方案可能是将组件与控制器分离,例如为每个控制器创建控制器类: 当组件是VBox时,您可以为其定义.fxml,如: <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.layout.VBox?> <VBox xmlns="http:/

我创建了自定义JavaFX组件,如中所述

如何将实体传递给组件? 我知道如何传递字符串-它只是
。但是如何传递任意类的实例呢?
请注意,不要为此使用单例模式。

问题的解决方案可能是将组件与控制器分离,例如为每个控制器创建控制器类: 当组件是VBox时,您可以为其定义

.fxml
,如:

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

<?import javafx.scene.layout.VBox?>
<VBox xmlns="http://javafx.com/javafx"
      xmlns:fx="http://javafx.com/fxml"
      fx:controller="stackoverflow.one.ComponentController">

</VBox>
您还可以像这样更改Roor:

<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="stackoverflow.one.RootController">
    <fx:include source="ComponentController.java" fx:id="component"/>

</AnchorPane>
现在您已经分离了控制器和视图组件,甚至不需要加载它们,因为
fxmloader
为您完成了这项工作。
这将是如何将对象传递给另一个视图的控制器的基本概念。

问题的解决方案可能是将组件与控制器分离,如为每个控制器创建控制器类: 当组件是VBox时,您可以为其定义
.fxml
,如:

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

<?import javafx.scene.layout.VBox?>
<VBox xmlns="http://javafx.com/javafx"
      xmlns:fx="http://javafx.com/fxml"
      fx:controller="stackoverflow.one.ComponentController">

</VBox>
您还可以像这样更改Roor:

<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="stackoverflow.one.RootController">
    <fx:include source="ComponentController.java" fx:id="component"/>

</AnchorPane>
现在您已经分离了控制器和视图组件,甚至不需要加载它们,因为
fxmloader
为您完成了这项工作。
这将是如何将对象传递给另一个视图的控制器的基本概念。

要使用
实体
标记,您应该有一个
setEntity
方法,但是
实体
是最终的,您不能这样做。你为什么要这样做?你到底想做什么?@Sunflame我想以此分解视图和模型。实体是一个模型。它与组件视图相关。在我的主要方法中,我实例化了模型(实体类),并希望将其传递到视图(组件)中?你想用你的模型做什么?@Sunflame我怎么得到模型有关系吗?我想在视图中渲染一些模型字段。为此,我需要将其传递给view。还有更简单的方法吗?但我仍然希望在某种程度上使用自定义组件,这很重要,因为如果要在
.fxml
中执行此操作,您必须知道要传递它的确切对象,例如,当您将
prefWidth
设置为像85这样的精确值时。但是,只需使用setter就可以设置实体,这对您来说是个问题吗?要使用
entity
标记,您应该有一个
setEntity
方法,但是
entity
是最终的,您不能这样做。你为什么要这样做?你到底想做什么?@Sunflame我想以此分解视图和模型。实体是一个模型。它与组件视图相关。在我的主要方法中,我实例化了模型(实体类),并希望将其传递到视图(组件)中?你想用你的模型做什么?@Sunflame我怎么得到模型有关系吗?我想在视图中渲染一些模型字段。为此,我需要将其传递给view。还有更简单的方法吗?但我仍然希望在某种程度上使用自定义组件,这很重要,因为如果要在
.fxml
中执行此操作,您必须知道要传递它的确切对象,例如,当您将
prefWidth
设置为像85这样的精确值时。但是使用setter可以简单地设置实体,这对您来说是个问题吗?
public class ComponentController implements Initializable{

    private Entity entity;

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

    }

    public Entity getEntity() {
        return entity;
    }

    public void setEntity(Entity entity) {
        this.entity = entity;
    }
}
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="stackoverflow.one.RootController">
    <fx:include source="ComponentController.java" fx:id="component"/>

</AnchorPane>
public class RootController implements Initializable {

    @FXML
    private ComponentController componentController;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // getting Entity from a service or from any other sources
        //You may replace this line with an appropriate one for you.
        Entity entity = getEntity();
        componentController.setEntity(entity);
    }
}