3

我正在尝试使用两个弹出菜单创建系统托盘图标,一个应该用鼠标左键调用,另一个用鼠标右键调用。AWT 提供了创建 PopupMenu 的简单方法,但是在不制作不可见的 JFrame 或其他东西的情况下,用鼠标左键调用菜单是不可能的。所以,我发现swing JPopupMenu 可以被任何鼠标按钮调用。但是 JPopupMenu 有错误(我不知道这是否真的是一个错误,或者我在 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);




}
4

2 回答 2

0

拿一个鼠标监听器并分开左键和右键:

从改变

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();
            }
        }
    }
});
于 2014-01-22T07:15:02.907 回答
0

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

有时,当您添加 menuItems 时,其JPopupMenu行为方式不可预测(当您将鼠标悬停在它上面时,它不会关闭)。

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

JMenuItem jmi1 = new JMenuItem("JMenuItem1");

jmi1.removeMouseMotionListener(jmi1.getMouseMotionListeners()[0]);
jmi1.removeMouseListener(jmi1.getMouseListeners()[0]);
于 2016-08-31T19:08:40.033 回答