我有一个控件应该响应某些类型的事件,因此将自己添加到构造函数中的侦听器列表中。当然它也应该删除自己,但是当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文件,我也看不到其他任何拥有必要信息的人(控件和“窗口关闭事件”)。
那么在不再使用控件后清理控件的好方法是什么?
答案 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模式,只收听自己子控件的事件。