hey*_*cam 4 java swing jpopupmenu
我希望在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"); }
}
Run Code Online (Sandbox Code Playgroud)
无论我如何与菜单交互,ComponentListener都不会调用这两种方法.这是为什么?有什么不同/更好/正确的方法可以找出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");
}
});
Run Code Online (Sandbox Code Playgroud)
编辑:哎呀,看起来有人选择在评论中回答.我的错.
编辑2:关于为什么ComponentListener没有发送菜单上的事件消失,这可能解释为:
组件隐藏和组件显示事件仅在调用Component的setVisible方法时发生.例如,窗口可能会被小型化为图标(图标化)而不会触发组件隐藏事件.
来源:ComponentListener教程 (也许是非规范的,但是来自马的嘴.)
考虑到结合JPopupMenu的实现setVisible:
public void setVisible(boolean b) {
// Not supported for MenuComponents
}
Run Code Online (Sandbox Code Playgroud)
你可能知道它是如何发生的,但不是为什么它会发生(理由是什么,哪里有正确记录?)