TabPane.getTabs().remove(tab) не вызывает прослушиватель

Я был чтение этого сообщения stackoverflow. И они говорят, что tabPane.getTabs().remove(tab) не вызовет слушателя при закрытии вкладки, что имеет смысл.

Поэтому я применил их решение к своей проблеме (я понимаю принцип, но не совсем код), но мой слушатель никогда не будет вызван. Ни tabPane.getTabs().remove(tab), ни closeTab(tab) с методом closeTab не определены так:

private void closeTab(Tab tab) {
        EventHandler<Event> handler = tab.getOnClosed();
        if (null != handler) {
            handler.handle(null);
        } else {
            tab.getTabPane().getTabs().remove(tab);
        }
    }

позвони моему слушателю. Однако мой слушатель вызывается, когда я закрываю вкладку с помощью мыши.

Вот мой слушатель:

private static void addListenerOnClosingTab(Tab tab) {
        tab.setOnCloseRequest(new EventHandler<Event>()
        {
            @Override
            public void handle(Event arg0)
            {
                Util.loggerControllerDiagram.info("Tab " + tab.getText() + " closed.");
            }
        });
    }
минимальный воспроизводимый пример, пожалуйста, демонстрируя, почему вы используете такую ​​необычную конструкцию - обработчик onClose уведомляется автоматически, если не null
kleopatra 23.04.2022 14:50

Если вы хотите реагировать на закрытие вкладки пользователем или программно, почему бы просто не добавить прослушиватель в список вкладок панели вкладок?

James_D 23.04.2022 15:45

Не знаю, о какой необычной конструкции вы говорите. Я только что скопировал другой ответ stackoverflow?

FluidMechanics Potential Flows 23.04.2022 20:13

Я действительно не понимаю, что вы подразумеваете под слушателем списка вкладок панели вкладок? извините, я новичок в java и javaFX.

FluidMechanics Potential Flows 23.04.2022 20:14

@FluidMechanicsPotentialFlows tabPane.getTabs() возвращает наблюдаемый список вкладок на панели вкладок. Добавьте к нему ListChangeListener. Я действительно не знаю, как сказать это проще, чем это.

James_D 23.04.2022 22:01
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
1
5
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, вы захотите использовать getOnCloseRequest вместо getOnClosed в своем методе closeTab:

EventHandler<Event> handler = tab.getOnCloseRequest();
handler.handle(null);
tab.getTabPane().getTabs().remove(tab);

Это работает очень хорошо, большое спасибо. Я действительно не понимаю, почему handler.handle принимает null в качестве аргумента?

FluidMechanics Potential Flows 23.04.2022 20:42

И почему нет if statement, который был в другом посте stackoverflow?

FluidMechanics Potential Flows 23.04.2022 20:51

Я не знаю, почему был оператор if, но не имеет значения, какой аргумент вы передадите в handler.handle, потому что, когда вы писали метод, вы все равно не использовали аргумент

IHopeItWontBeAStupidQuestion 24.04.2022 12:35

Ни один из этих подходов (в других текущих ответах в этом посте или в исходном посте, на который вы ссылаетесь) действительно не имеет смысла для меня. Возможно, я не понимаю, что вы пытаетесь сделать.

Если вы хотите реагировать на удаление вкладки, независимо от того, удаляется ли она пользователем, нажимающим кнопку закрытия вкладки, или программно, манипулируя списком вкладок панели вкладок, обычным подходом будет регистрация слушателя со списком вкладок:

private TabPane tabPane ;

// ...

tabPane.getTabs().addListener((Change<? extends Tab> c) -> {
    while (c.next()) {
        if (c.wasRemoved()) {
            for (Tab tab : c.getRemoved()) {
                System.out.println("Tab " + tab.getText() + " closed.");
            }
        }
    }
});

Я понимаю вашу идею, но у меня есть эта ошибка: i.imgur.com/Z00yKgF.png. Я предполагаю, что разница с другими сообщениями/комментариями заключается в том, что слушателя нет в списке, но на каждой из вкладок есть обработчик событий? Все еще не уверен, что делает handler.handle. Поэтому, если я смогу заставить ваше решение работать, я буду более удовлетворен, поскольку оно более понятно.

FluidMechanics Potential Flows 24.04.2022 11:46

@FluidMechanicsPotentialFlows Так и должно было быть c.next() (я отредактировал код, чтобы исправить это).

James_D 24.04.2022 15:28

Другие вопросы по теме