【问题标题】:Is there a counterpart to @FXML initialize?@FXML 初始化有对应的吗?
【发布时间】:2017-12-21 10:42:38
【问题描述】:

当一个视图被销毁(舞台关闭,另一个视图取而代之等)时,是否有任何方法会在控制器上被调用?也就是说,是否有对应的:

@FXML
private void initialize()

更新:我这样做的原因是我的应用程序正在接收来自 PubNub 的消息,然后这些消息需要中继到这些控制器,以便他们可以选择是对它们采取行动还是不是(它们是否这样做取决于内部控制器信息,例如视图的大小)。

我的计划是让这些控制器在全局列表中注册自己,并在销毁时取消注册。

【问题讨论】:

  • 不,没有这样的方法。
  • 我不这么认为......
  • 真正的问题是“当某个 UI 部分不再可用时,为什么我应该使用该部分的控制器?”。 @Pablo - 你能回答这个问题吗?
  • 目前还不清楚是否有一个很好的定义来“销毁”视图,无论如何它都可以用来触发这样的方法。这听起来像X-Y question
  • 这个用例很有意义。但是,最终,FX 工具包不会以任何方式管理控制器的生命周期,除了在某些情况下为您创建它们。因此,工具包无法知道您何时不再使用控制器。首先,如果一个窗口关闭,例如,工具包确实无法知道其中显示的 UI 是否是从 FXML 加载的,即使是这样,也无法确定您是否可能要再次显示该 UI。所以你真的只需要自己管理。

标签: java javafx


【解决方案1】:

大多数 cmets 都告诉您 JavaFX 中没有这样的等效功能。 James_D 也提到了使用WeakReference,我相信这是解决您问题的好方法。

public final class PubNubManager {
    private final List<WeakReference<PubNubListener>> listeners = new ArrayList<>();

    // Other standard singleton stuff

    public void informListeners(PubNubData data) {
        listeners.stream().forEach(listenerRef -> {
            if (listenerRef.get() != null)
                listenerRef.get().receiveData(data);
        });

        // You can remove weakreference that are no longer valid, or stop getting for data when there are no more listener.
    }

    public void registerListener(PubNubListener listener) {
        if (listener != null)
            listeners.add(new WeakReference<>(listener));
    }

    // You can make one to unregister too if you want.
}

public interface PubNubListener {
    void receiveData(PubNubData data);
}

public class ControllerA implements PubNubListener {
    @Override
    public void receiveData(PubNubData data) {
        // What you need to do
    }
}

【讨论】:

  • 不错的演示。几个厘米。 1. 这依赖于保留对控制器的引用的视图。如果控制器注册了某种类型的事件侦听器,并且在 FXML 文件中定义了一个或多个 UI 元素,则这种情况自然会发生;但是如果控制器的存在仅仅是为了用通知更新 UI,它可能会过早地超出范围并且通知会停止。 2. 反之,在控制器超出范围后,不能​​保证弱引用何时或什至无效。因此,这可以防止内存泄漏,但通知可能会无限期地继续。
  • @James_D 是的。如果这个解决方案在视图和控制器一起被垃圾收集的理想世界中,并且一旦它们超出范围,它似乎工作得很好。我想最安全的方法仍然是在控制器中获取Stage 的引用,并监听窗口隐藏事件,然后手动从管理器中注销。
  • 我认为这取决于注销听众的动机。如果只是为了确保没有对未使用的控制器保留不必要的引用(即,它是为了防止内存泄漏),那么这种方法就足够了。如果 OP 担心执行从 CPU 性能角度来看没有影响的代码(通知),那么这将无法满足需要。 (不过,我发现很难想象后者在实践中会成为一个真正的问题。)
猜你喜欢
  • 1970-01-01
  • 2015-05-05
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多