鼠标退出时的 Java jpopupmenu

标签 java swing mouselistener jpopupmenu trayicon

我正在尝试创建带有两个弹出菜单的系统托盘图标,一个应该用鼠标左键调用,另一个应该用鼠标右键调用。 AWT 提供了创建 PopupMenu 的简单方法,但在不创建不可见的 JFrame 或其他内容的情况下,不可能用鼠标左键调用菜单。因此,我发现 swing JPopupMenu 可以通过任何鼠标按钮调用。但是JPopupMenu有一个bug(我不知道这是否真的是一个bug,或者我对Java不太擅长),当我在JPopupMenu之外按下鼠标时它不会隐藏。我尝试使用鼠标监听器的函数 mouseExited,但它仅适用于 JPopupMenu 边框。如果鼠标离开 JPopupMenu 边框,它会隐藏,我无法按任何 JPopupMenu 按钮。也许,任何人都有同样的问题,可以帮助我找出如何让它正常工作。

public static JPopupMenu jpm;
public static TrayIcon ti;

public static void main(String args[]) throws IOException, AWTException,
        ClassNotFoundException, InstantiationException,
        IllegalAccessException, UnsupportedLookAndFeelException {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    SystemTray st = SystemTray.getSystemTray();
    Image icon = ImageIO.read(SipLogin.class
            .getResource("/resources/phone-yellow-small.png"));

    ti = new TrayIcon(icon, "Sip login", null);

    jpm = new JPopupMenu();

    JMenuItem jmi1 = new JMenuItem("JMenuItem1");
    JMenuItem jmi2 = new JMenuItem("JMenuItem2");
    JMenuItem jmi3 = new JMenuItem("JMenuItem3");
    JMenuItem jmi4 = new JMenuItem("JMenuItem4");



    ti.addMouseListener(new MouseAdapter() {
        public void mouseReleased(MouseEvent e) {
            if (e.isPopupTrigger()) {
                jpm.setLocation(e.getX(), e.getY());
                jpm.setInvoker(jpm);
                jpm.setVisible(true);
            }
        }
    });

    jpm.add(jmi1);
    jpm.add(jmi2);
    jpm.add(jmi3);
    jpm.add(jmi4);

    jpm.addMouseListener(new MouseAdapter() {
        public void mouseExited(MouseEvent e) {
            jpm.setVisible(false);
        }
    });

    st.add(ti);




}

最佳答案

采用一个鼠标监听器并将左键单击和右键单击分开:

更改自

ti.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
        if (e.isPopupTrigger()) {
            jpm.setLocation(e.getX(), e.getY());
            jpm.setInvoker(jpm);
            jpm.setVisible(true);
        }
    }
});

ti.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
        if(e.getclickCount < 2){
            if(e.getButton().equals(MouseEvent.Button1){
                showPopup1();
            }
            if(e.getButton().equals(MouseEvent.Button3){
                showPopup2();
            }
        }
    }
});

关于鼠标退出时的 Java jpopupmenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17721293/

相关文章:

java - 使用Parse.com指针查询两个类的数据,指针值异常

java - 如何使用MySQL数据库正确更新JTable数据?

java - Java Swing 中 JTable 对应的 WPF .NET 组件是什么?

java - 单击时使用 MouseListener 移动图像

java - 我有一个 boolean 变量来暂时禁用我的鼠标监听器,但它会记住我单击的位置

java - 难以捉摸的球类游戏项目

java - 保留 - Eclipse 和 Java

java - 如何使变量在后台每秒递增

java - 学习 Java - 告诉我有关具有另一个类的数据类型的输入变量的构造函数的更多信息

java - 当用户想在java中将文件保存在C盘根目录中时如何显示消息