2012-07-11 119 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"); 
    } 
}); 

覆蓋任何其他方法,如果你想要一個不同類型的事件(而不僅僅是點擊來自示例的事件 以上)。