【问题标题】:leaking 'this' in constructor when using <fx:root>使用 <fx:root> 时在构造函数中泄漏“this”
【发布时间】:2014-10-18 11:02:35
【问题描述】:

Introduction to FXML 提供了如何使用 构建自定义组件的示例。以下是文档中的一些 sn-p:

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);
    }
}

这里,构造函数正在泄漏可能导致some unpleasure consequence 的“this”。

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

【问题讨论】:

  • 我现在遇到了这个问题,在一个我没有意识到的课程上(因为我现在没有真正使用它),并检查了我使用的课程,并意识到我已将上述代码放入init() 方法中,这对我有用。我不确定这是否真的能解决任何问题,但警告消失了。

标签: java javafx fxml fxmlloader


【解决方案1】:

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

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

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

【讨论】:

  • 你有一个例子来说明你将如何实现你所说的吗?
猜你喜欢
  • 2012-07-24
  • 1970-01-01
  • 2014-11-30
  • 2021-06-17
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多