java - 如何在 JavaFx 中为自定义组件创建属性?

标签 java javafx properties gluon

经过几个小时的工作,我已经设法了解如何使用 javafx 和 Gluons Scene Builder 创建自定义组件。 如何为该组件添加一个新属性,该属性将出现在场景构建器属性菜单中,以便可以在设计时输入属性值。

最佳答案

您需要对某些内容进行子类化,很可能是 ParentRegionPane 的实现。从那里您可以加载由您在 Scene Builder 中所做的任何操作生成的 FXML。

示例:

public class MyComponent extends VBox {
    private final StringProperty foo = new SimpleStringProperty();

    public MyComponent {
        final Parent root = (Parent) FXMLLoader.load(getClass().getResource(fxmlPath));

        getChildren().add(root);
    }

    public final StringProperty fooProperty() { return foo; }
    public final String getFoo() { return foo.get(); }
    public final void setFoo(String foo) { this.foo.set(foo); }
}

这可能会产生一个额外的容器,一个是MyComponent,另一个是FXML 的根节点。为了防止这种情况,请使用 FXMLLoader.setRoot()

更新

看来你有一个额外的障碍 - 具有主要逻辑的 Controller 与 MyComponent 解耦。

有很多方法可以做到这一点:

通过引用传递

您可以将MyComponent的引用传入 Controller 。

public class MyController {
    /* Your controller stuff */

    private MyComponent component;

    public final void setComponent(MyComponent component) {
        // You can bind your controller properties to fooProperty here
    }
}

然后,当在 MyComponent 中加载 FXML 时,您将获取 Controller 的引用并手动调用 setComponent()

通过公开 Controller 属性

该方法直接暴露MyComponent中 Controller 的属性

public class MyComponent extends VBox {
    // Other stuff

    private MyController controller;

    public MyComponent {
        // Original stuff

        this.controller = loader.getController();
    }

    public final StringProperty fooProperty() {
        assert controller != null; // If you loaded correctly this assertion should be valid

        return controller.fooProperty();
    }

    public final String getFoo() { return fooProperty().get(); }
    public final void setFoo(String foo) { fooProperty().set(foo); }
}

将 Controller 集成到组件中

此方法只是将 MyComponentMyController 组合到一个类中。您需要FXMLLoader.setController(this)

优点是您可以直接访问所有内容。不好的是,有些人会说这违反了 MVC。

关于java - 如何在 JavaFx 中为自定义组件创建属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47710056/

相关文章:

java - 如何从 Xpages 用 Ja​​va 发送电子邮件?

iOS - 直接使用getter/setter方法好还是属性好

javascript - RequireJS - 调用模块内的另一个属性。

java - JRMP 连接建立错误

java - 编译器告诉我为java创建新文件

java - Eclipse:如何查找继承字段的引用(不是

java - 如何像 Swing 中的 JTable 一样在 JavaFX TableView 中单击时获取第一列值?

javafx - 如何找出JavaFX版本

java - 如何在没有 FXML 的情况下创建自定义复合控件?

使用泛型的 Delphi 属性 getter 函数