【问题标题】:Open popup(Menu) on task tray icon with left click using java使用java左键单击任务托盘图标上的弹出窗口(菜单)
【发布时间】:2012-07-10 19:10:22
【问题描述】:

我正在使用 java 中的任务托盘图标,我喜欢使用左键打开一个弹出菜单,就像我在右键单击时打开的一样,请帮助我快速响应。

提前谢谢...

这是适用于右键单击的代码需要在左键单击时显示相同的弹出窗口... 不要忘记放置任何名称为“titleImg.jpg”的图片@“src/img”文件夹

只需运行它...这是一个工作示例,但我必须使用左键显示相同的弹出窗口

我已经检查了鼠标监听器,它会监听托盘图标上的左键单击,但是如何使用它来显示弹出菜单???

    package com.abc.dao;

import java.awt.AWTException;
import java.awt.CheckboxMenuItem;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;

public class MyTaskTray {
    public static void main(String arg[]){

        //Check the SystemTray is supported
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }
        final PopupMenu popup = new PopupMenu();
        final TrayIcon trayIcon =
                new TrayIcon(Toolkit.getDefaultToolkit().getImage(new java.io.File("").getAbsolutePath()+"/bin/img/titleImg.jpg"), "Library Drop");
        final SystemTray tray = SystemTray.getSystemTray();

        // Create a pop-up menu components
        MenuItem aboutItem = new MenuItem("About");
        CheckboxMenuItem cb1 = new CheckboxMenuItem("Set auto size");
        CheckboxMenuItem cb2 = new CheckboxMenuItem("Set tooltip");
        Menu displayMenu = new Menu("Display");
        MenuItem errorItem = new MenuItem("Error");
        MenuItem warningItem = new MenuItem("Warning");
        MenuItem infoItem = new MenuItem("Info");
        MenuItem noneItem = new MenuItem("None");
        MenuItem exitItem = new MenuItem("Exit");

        //Add components to pop-up menu
        popup.add(aboutItem);
        popup.addSeparator();
        popup.add(cb1);
        popup.add(cb2);
        popup.addSeparator();
        popup.add(displayMenu);
        displayMenu.add(errorItem);
        displayMenu.add(warningItem);
        displayMenu.add(infoItem);
        displayMenu.add(noneItem);
        popup.add(exitItem);

        trayIcon.setPopupMenu(popup);

        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("TrayIcon could not be added.");
        }

    }
}

【问题讨论】:

  • 到目前为止你有什么?
  • @Guillaume Polet,感谢您的大力帮助
  • 如果答案有助于和/或解决了您的问题,您可以投票和/或接受答案。干杯;-)

标签: java swing trayicon jpopupmenu


【解决方案1】:

我认为您正在寻找一个MouseListener,您将把它添加到您的TrayIcon,并在单击、移动鼠标​​上的按钮等时激活它。要让它在左键单击时运行,只需看看MouseEvent (BUTTON1) 上的 ButtonMask 用于单击鼠标左键。

【讨论】:

  • 您添加的链接是针对 c# 而不是 Java
【解决方案2】:

你可以将ActionListener添加到TrayIcon,鼠标双击可以显示JOptionPane

trayIcon.addActionListener(new ActionListener() {

   @Override
   public void actionPerformed(ActionEvent e) {
       JOptionPane.showMessageDialog(null, "This dialog box is run from System Tray");
   }
});

【讨论】:

  • @Farid 无所谓,是弹出菜单、弹出窗口还是对话框
  • 我对你的代码没有任何问题,setPopupMenu() 的JPopupMenu 加速器是鼠标右键,使用show(Component invoker, int x, int y)
【解决方案3】:

【讨论】:

  • 已经检查了这个例子,它有两个问题,第一个它也适用于右键单击而不是左键,第二个当它显示菜单没有被删除的弹出菜单时......你给出的第一个例子仅适用于右键单击我也将此用于右键单击。但我必须在左键单击时显示相同的弹出窗口
【解决方案4】:

您实际上缺少的是显示 PopupMenu 的父组件。实现这一点的一种方法是使用“不可见”框架(实际上它是可见的,但边界为 0 且未装饰,因此您看不到它),如下所示:

import java.awt.AWTException;
import java.awt.CheckboxMenuItem;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.MalformedURLException;
import java.net.URL;

public class MyTaskTray {
    public static void main(String arg[]) throws MalformedURLException {
        final Frame frame = new Frame("");
        frame.setUndecorated(true);
        // Check the SystemTray is supported
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }
        final TrayIcon trayIcon = new TrayIcon(Toolkit.getDefaultToolkit().getImage(
                new URL("http://home.comcast.net/~supportcd/Icons/Java_Required.jpg")), "Library Drop");
        final SystemTray tray = SystemTray.getSystemTray();

        // Create a pop-up menu components
        final PopupMenu popup = createPopupMenu();
        trayIcon.setPopupMenu(popup);
        trayIcon.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1) {
                    frame.add(popup);
                    popup.show(frame, e.getXOnScreen(), e.getYOnScreen());
                }
            }
        });
        try {
            frame.setResizable(false);
            frame.setVisible(true);
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("TrayIcon could not be added.");
        }

    }

    protected static PopupMenu createPopupMenu() {
        final PopupMenu popup = new PopupMenu();
        MenuItem aboutItem = new MenuItem("About");
        CheckboxMenuItem cb1 = new CheckboxMenuItem("Set auto size");
        CheckboxMenuItem cb2 = new CheckboxMenuItem("Set tooltip");
        Menu displayMenu = new Menu("Display");
        MenuItem errorItem = new MenuItem("Error");
        MenuItem warningItem = new MenuItem("Warning");
        MenuItem infoItem = new MenuItem("Info");
        MenuItem noneItem = new MenuItem("None");
        MenuItem exitItem = new MenuItem("Exit");
        // Add components to pop-up menu
        popup.add(aboutItem);
        popup.addSeparator();
        popup.add(cb1);
        popup.add(cb2);
        popup.addSeparator();
        popup.add(displayMenu);
        displayMenu.add(errorItem);
        displayMenu.add(warningItem);
        displayMenu.add(infoItem);
        displayMenu.add(noneItem);
        popup.add(exitItem);
        return popup;
    }
}

从 Java 1.7 开始,您可以添加以下行以从任务栏中删除应用程序栏:

frame.setType(Type.UTILITY);

【讨论】:

  • 它工作得很好,但是当我右键单击图标时,然后当我左键单击图标时,单击左键如果给出 Exception:java.lang.IllegalArgumentException: origin not in parent's hierarchy在 java.awt.PopupMenu.show(Unknown Source) at com.MyTaskTray$1.mouseClicked(MyTaskTray.java:66) at java.awt.TrayIcon.processMouseEvent(Unknown Source) at java.awt.TrayIcon.processEvent(Unknown Source)在 java.awt.TrayIcon.dispatchEvent(Unknown Source)
  • @Farid 确实会引起问题,我错过了。解决方案是在显示弹出窗口之前将弹出窗口添加到frame。我已经更新了我的帖子以反映这一点。
  • 这解决了我的问题并且工作良好,但是有一点对用户下次使用它会有好处,如果我们使用 JDialog 代替 Frame 它会变得更好,因为它不会在开始栏上显示框架
  • @Farid,不完全确定,但您可以改用 JWindow
  • 好主意。我从你的回答中得到了很多帮助。
【解决方案5】:

这应该可行:

trayIcon.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        JOptionPane.showMessageDialog(null, "This shows after a left-click on tray icon");
    }
});

如果您想要不同类型的事件(不仅仅是上面示例中的点击事件),请覆盖任何其他方法。

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 2020-05-10
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多