5

我想在我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的隐藏时间?

谢谢,

卡梅伦

4

1 回答 1

6

JPopupMenu对可见性更改事件有一个特殊的监听器:

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

但是请注意,正如方法名称所暗示的那样,它们在可见性更改之前被调用,因此如果您isVisible()在事件处理程序中的某处调用,您应该意识到这一点,例如:

@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
    updateMenu();
}

private void updateMenu() {
    if (!menu.isVisible()) { // this won't work!
        // perform some updates
    }
}

关于为什么ComponentListener菜单上的事件没有消失,这可以解释:

组件隐藏和组件显示事件仅在调用 Component 的 setVisible 方法时发生。例如,一个窗口可能会被小型化为一个图标(图标化),而不会触发组件隐藏事件。

资料来源:ComponentListener 教程 (可能是非规范的,但来自马的嘴。)

结合JPopupMenu' 的实现考虑setVisible

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

而且您可能知道它是如何发生的,但不知道为什么会发生(理由是什么,在哪里正确记录?)

于 2010-06-14T03:47:46.183 回答