将自定义类型的FXML属性设置为自定义javafx组件的属性
我创建了自定义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:/
。但是如何传递任意类的实例呢?
请注意,不要为此使用单例模式。
问题的解决方案可能是将组件与控制器分离,例如为每个控制器创建控制器类: 当组件是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);
}
}