2012-07-11 292 views
12

我正在任务托盘上工作图标在java中,我喜欢打开一个弹出菜单使用左键单击相同的弹出菜单,因为我打开右键单击,请帮助我以一个快速的回应。使用java左键点击任务栏图标打开弹出菜单(菜单)

在此先感谢...

这里工作右键单击该代码需要表现出同样的弹出式左键单击...... 不要忘记将任何图像@“的src/IMG”文件夹命名“titleImg.jpg”

只要运行这个...这是一个工作的例子,但我一直在使用左键点击

我已经检查了鼠标监听,以显示相同的弹出式窗口,它监听托盘图标,左键点击但如何使用该显示弹出菜单?

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."); 
     } 

    } 
} 
+1

到目前为止你有什么? – 2012-07-11 08:06:25

+1

查看我的回答如下 – 2012-07-12 12:18:30

+0

@ Guillaume Polet,感谢您的大力帮助 – NoNaMe 2012-07-27 05:09:05

回答

13

什么你实际上缺乏是显示您的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); 
+0

它工作良好,但是当我右键单击该图标,之后当我左键单击该图标时,如果给出Exception:java.lang,单击左键。抛出:IllegalArgumentException:起源不是在父母的层次 \t在java.awt.PopupMenu.show(来源不明) \t在com.MyTaskTray $ 1.mouseClicked(MyTaskTray.java:66) \t在java.awt.TrayIcon.processMouseEvent(来源不明) \t at java.awt.TrayIcon.processEvent(Unknown Source) \t at java.awt.TrayIcon.dispatchEvent(Unknown Source) – NoNaMe 2012-07-26 06:59:14

+0

@Farid确实会导致问题,我错过了。解决方案是在显示弹出窗口之前将弹出框添加到“框架”。我已更新我的帖子以反映这一点。 – 2012-07-26 12:53:44

+0

这解决了我的问题并且运行良好,但有一件事对于下次用户使用它会有好处,如果我们使用JDialog代替Frame,它将变得更好,因为它不会在起始栏上显示Frame – NoNaMe 2012-07-27 05:07:20

2

我认为你正在寻找一个MouseListener您将添加到您的TrayIcon并点击鼠标按钮时会激活,移动等。为了得到它的左点击操作只是看看MouseEventBUTTON1)上的ButtonMasks用于鼠标左键单击。

+1

你添加的链接是为c#而不是Java – 2012-07-26 12:59:57

4

您可以添加ActionListenerTrayIcon,鼠标DOUBLE_CLICK可以显示JOptionPane

trayIcon.addActionListener(new ActionListener() { 

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

@Farid无关紧要,如果弹出菜单,弹出窗口或对话框 – mKorbel 2012-07-12 10:56:54

+0

我没有任何问题与您的代码,JPopupMenu加速器'setPopupMenu()'是鼠标右键,使用[show(Component invoker,int x,int y)](http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html) – mKorbel 2012-07-12 11:19:46

1
+0

已经检查过这个例子,它有2个问题,第一,它也适用于右键单击不显示左侧和第二个,当它显示弹出菜单菜单不会被删除...和第一个例子你给我的作品右键单击我也用这个右单击。但我必须显示相同的弹出窗口左键单击 – NoNaMe 2012-07-12 10:45:55

1

这应该工作:

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

覆盖任何其他方法,如果你想要一个不同类型的事件(而不仅仅是点击来自示例的事件 以上)。