处理JavaFX控件的方法

时间:2015-09-16 05:43:50

标签: java javafx

我有一个控件应该响应某些类型的事件,因此将自己添加到构造函数中的侦听器列表中。当然它也应该删除自己,但是当Swing和RCP有dispose()方法时,我似乎无法在JavaFx中找到任何方法。

public class MyTable extends TableView implements MyListener {

public MyTable () {
    Events.addListener(this);
}

public disposeOrSomething() {
    Events.removeListener(this);
}

// actual implementation of MyListener 

}

请不要挂静静Events类。如果控件将自身添加到静态或不静态的东西,对我来说无关紧要。重要的是:除了一般事件系统之外,应用程序的两个部分没有连接。因此,当收听部分消失(例如窗户关闭)时,听众应当被处理掉。

直到知道,当监听器直接连接到控件的生命周期时,控件才会注册它。但是现在在JavaFX中无法工作,并且由于松散耦合的FXML文件,我也看不到其他任何拥有必要信息的人(控件和“窗口关闭事件”)。

那么在不再使用控件后清理控件的好方法是什么?

2 个答案:

答案 0 :(得分:1)

如前所述,我建议不要使用全局事件总线,并且正如@Puce所建议的那样,不要在封装对象之外的任何内容上注册侦听器。

无论如何,这是一种仅在显示某个Node时自动订阅事件的方法(即,当从场景中移除节点或窗口关闭时自动取消订阅)。此解决方案使用ReactFX,即帮助EventStream#conditionOnShowing方法。

由于您没有提供MyListener的签名,我将假设此签名:

@FunctionalInterface
interface MyListener {
    void handle(MyEvent event);
}
import org.reactfx.EventStream;
import org.reactfx.EventStreamBase;
import org.reactfx.Subscription;

public class MyTable extends TableView {
    public MyTable () {

        // Since you are using some custom event dispatching mechanism,
        // the first step is to convert that into a ReactFX EventStream.
        EventStream<MyEvent> events = new EventStreamBase<MyEvent>() {
            @Override protected Subscription observeInputs() {
                MyListener l = event -> notifyObservers(event);
                Events.addListener(l);
                return () -> Events.removeListener(l);
            }
        };

        // Now the interesting part: events will not be observed whenever
        // this MyTable is not part of a showing Window.
        events.conditionOnShowing(this).subscribe(event -> this.handleEvent(Event));
    }

    private void handleEvent(MyEvent) {
        /* ... */
    }
}

答案 1 :(得分:0)

我建议使用Mediator模式,只收听自己子控件的事件。