首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mouseExited上的Java jpopupmenu

mouseExited上的Java jpopupmenu
EN

Stack Overflow用户
提问于 2013-07-18 18:44:38
回答 2查看 1.1K关注 0票数 3

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

代码语言:javascript
复制
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);




}
EN

回答 2

Stack Overflow用户

发布于 2014-01-22 15:15:03

选择一个鼠标监听器,并将左击和右击分开:

更改自

代码语言:javascript
复制
ti.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {
        if (e.isPopupTrigger()) {
            jpm.setLocation(e.getX(), e.getY());
            jpm.setInvoker(jpm);
            jpm.setVisible(true);
        }
    }
});

代码语言:javascript
复制
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();
            }
        }
    }
});
票数 0
EN

Stack Overflow用户

发布于 2016-09-01 03:08:40

谢谢你非常有用的对话,但我需要补充一些话:

有时当你添加menuItems时,JPopupMenu的行为是不可预知的(当你将鼠标移到它上面时,它并没有关闭)。

在这种情况下,您需要从菜单项中删除鼠标运动监听器

代码语言:javascript
复制
JMenuItem jmi1 = new JMenuItem("JMenuItem1");

jmi1.removeMouseMotionListener(jmi1.getMouseMotionListeners()[0]);
jmi1.removeMouseListener(jmi1.getMouseListeners()[0]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17721293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档