如何向JavaFX选项卡添加多个选项卡关闭事件处理程序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何向JavaFX选项卡添加多个选项卡关闭事件处理程序?相关的知识,希望对你有一定的参考价值。
JavaFX的Tab
类提供了一个setOnClosed
方法来添加一个在关闭选项卡时执行的事件处理程序。
当我只想添加一个事件处理程序时,这很有效。我还没有实现的是添加多个事件处理程序,因为第二次调用setOnClosed
会“覆盖”第一次调用时设置的事件处理程序。
在下面的代码示例中,仅在tab close上执行doSomethingIsExecuted
,但我希望执行所有三个事件处理程序。
Tab tab = new Tab();
tab.setOnClosed(event -> doSomething());
tab.setOnClosed(event -> doSomethingElse());
tab.setOnClosed(event -> doSomethingIsExecuted());
附加信息:在我的情况下,不可能将三个事件处理程序合并为一个,我真的需要一个解决方案来添加多个事件处理程序。
答案
使用从列表中调用多个处理程序的处理程序:
List<EventHandler<Event>> closedEventHandlers = new ArrayList<>();
tab.setOnClosed(event -> {
for (Iterator<EventHandler<Event>> iterator = closedEventHandlers.iterator(); !event.isConsumed() && iterator.hasNext();) {
iterator.next().handle(event);
}
});
如果您没有地方将元素添加到列表中,您可以使用辅助方法将列表存储在Tab
的属性中:
public final class TabUtils {
private TabUtils() {}
private static final String TAB_CLOSED_HANDLERS_KEY = "TabUtils.CLOSED_EVENT.list";
public static void addClosedHandler(Tab tab, EventHandler<Event> handler) {
List<EventHandler<Event>> handlers = (List<EventHandler<Event>>) tab.getProperties().get(TAB_CLOSED_HANDLERS_KEY);
if (handlers == null) {
// create & store new handler list and register handler
handlers = new ArrayList<>();
tab.getProperties().Put(TAB_CLOSED_HANDLERS_KEY, handlers);
tab.setOnClosed(event -> {
for (Iterator<EventHandler<Event>> iterator = handlers.iterator(); !event.isConsumed() && iterator.hasNext();) {
iterator.next().handle(event);
}
});
}
handlers.add(handler);
}
public static void removeClosedHandler(Tab tab, EventHandler<Event> handler) {
List<EventHandler<Event>> handlers = (List<EventHandler<Event>>) tab.getProperties().get(TAB_CLOSED_HANDLERS_KEY);
if (handlers != null) {
if (handlers.remove(handler) && handlers.isEmpty()) {
// remove handler list and handler if there are no more handlers
tab.getProperties().remove(TAB_CLOSED_HANDLERS_KEY);
tab.setOnClosed(null);
}
}
}
}
以上是关于如何向JavaFX选项卡添加多个选项卡关闭事件处理程序?的主要内容,如果未能解决你的问题,请参考以下文章