Почему componentHidden не вызывается для моего JPopupMenu? - PullRequest
4 голосов
/ 14 июня 2010

Я хочу получать уведомления, когда мой JPopupMenu скрыт - независимо от того, был ли выбран элемент, меню было закрыто или setVisible(false) было вызвано. Вот мой тестовый код:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class A extends ComponentAdapter implements Runnable, ActionListener {
    private JButton b;

    public static void main(String[] args) {
        EventQueue.invokeLater(new A());
    }

    public void run() {
        JFrame f = new JFrame("Test");
        b = new JButton("Click me");
        b.addActionListener(this);
        f.add(b);
        f.pack();
        f.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        JPopupMenu pm = new JPopupMenu();
        pm.addComponentListener(this);
        pm.add("Popup...");
        pm.add("...menu!");
        pm.show(b, 10, 10);
    }

    public void componentShown(ComponentEvent e) { System.out.println("componentShown"); }
    public void componentHidden(ComponentEvent e) { System.out.println("componentHidden"); }
}

Независимо от того, как я взаимодействую с меню, ни один из двух ComponentListener методов не вызывается. Это почему? Есть ли другой / лучший / правильный способ узнать, когда мой JPopupMenu скрыт?

Спасибо

Cameron

1 Ответ

5 голосов
/ 14 июня 2010
pm.addPopupMenuListener(new PopupMenuListener() {

    @Override
    public void popupMenuCanceled(PopupMenuEvent e) {
        System.out.println("cancelled");
    }

    @Override
    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
        System.out.println("vanishing");
    }

    @Override
    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
        System.out.println("appearing");
    }
});

Редактировать: Упс, похоже, кто-то решил ответить в комментариях.Мой плохой.

Редактировать 2: Что касается того, почему ComponentListener не отправляет вам события в исчезающем меню, это может объяснить:

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

Источник: Учебник по ComponentListener (возможно, не канонический, но из уст лошади.)

Рассмотрим, что в сочетании с реализацией JPopupMenu setVisible:

    public void setVisible(boolean b) {
        // Not supported for MenuComponents
    }

И вы, возможно, знаете, как это происходит, но не то, почему это происходит (каково обоснование и где это должным образом задокументировано?)

...