【问题标题】:How to add multiple tab close event handlers to JavaFX Tab?如何将多个选项卡关闭事件处理程序添加到 JavaFX 选项卡?
【发布时间】:2018-03-01 13:47:34
【问题描述】:

JavaFX 的Tab 类提供了一个setOnClosed 方法来添加一个事件处理程序,该处理程序在选项卡关闭时执行。

当我只想添加一个事件处理程序时,这很有效。 我还没有实现的是添加多个事件处理程序,因为第二次调用 setOnClosed 会“覆盖”第一次调用时设置的事件处理程序。

在下面的代码示例中,只有doSomethingIsExecuted 在标签关闭时执行,但我希望所有三个事件处理程序都被执行。

Tab tab = new Tab();
tab.setOnClosed(event -> doSomething());
tab.setOnClosed(event -> doSomethingElse());
tab.setOnClosed(event -> doSomethingIsExecuted());

附加信息:在我的情况下,不可能将三个事件处理程序合并为一个,我真的需要一个解决方案来添加多个事件处理程序。

【问题讨论】:

  • 似乎没有任何 API 可以让您直接执行此操作。我认为唯一的选择是 1。如果您有权访问选项卡窗格,请使用其选项卡列表注册一个侦听器,以便在从列表中删除选项卡时做出响应。您可以通过这种方式注册多个侦听器。 2. 将处理程序设置为包装任何现有处理程序并调用它的处理程序,然后执行附加操作。这相当容易,但很难以这种方式删除任何处理程序。

标签: java javafx tabs event-handling eventhandler


【解决方案1】:

使用从列表中调用多个处理程序的处理程序:

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

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 2016-10-09
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2011-05-10
    相关资源
    最近更新 更多