3

FXML 简介有示例如何使用 <fx:root> 构建自定义组件。以下是文档中的一些片段:

public CustomControl() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("custom_control.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);

    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}

在这里,构造函数正在泄漏“this”,这可能会导致一些不愉快的后果

在构造函数中将“this”传递给 FXMLLoader 是否安全?如果没有,有什么建议可以使这段代码安全吗?

4

1 回答 1

1

考虑到该示例来自docs.oracle.com以及他们使用它来演示功能的事实,我认为它应该是安全的。不过,你提出了一个很好的观点。

你可以做的是尽量避免同时代表根和控制器的类。毕竟从语义上讲,将它们分开会更好。因此,在上面的示例中,您可以使用CustomBox extends VBoxforfx:rootCustomBoxControllerasfx:controller并将初始化负担放在 .fxml 上。

我想至少你可以对这样一个组合的自定义控件进行某种包装。然后包装器将创建控制对象,用它初始化加载器并最终加载它。如果您有超过 1 个这样的类,您可以使用相同的包装器来初始化所有自定义控件。

于 2015-05-05T17:52:14.060 回答