2012-07-11 15 views
12

Tôi đang làm việc trên khay tác vụ Biểu tượng trong java, tôi muốn mở Menu bật lên bằng cách nhấp chuột trái cùng Menu bật lên khi tôi mở trên nhấp chuột phải và vui lòng trợ giúp tôi với một phản ứng nhanh.Mở cửa sổ bật lên (Menu) trên biểu tượng khay tác vụ bằng cách nhấp chuột trái bằng cách sử dụng java

Cảm ơn trước ...

đây là đoạn code làm việc cho click chuột phải cần để hiển thị cùng một cửa sổ bật lên trên nhấp chuột trái ... đừng quên đặt bất kỳ hình ảnh @ "src/img" thư mục với tên "titleImg.jpg"

Chỉ cần chạy này ... nó là một ví dụ làm việc nhưng tôi phải thể hiện cùng một cửa sổ bật lên sử dụng trái nhấp chuột

tôi đã kiểm tra chuột Listener, nó nghe các nhấp chuột trái vào biểu tượng khay nhưng làm thế nào để hiển thị menu popup bằng cách sử dụng ???

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

Bạn có gì cho đến nay? –

+1

Xem câu trả lời của tôi bên dưới –

+0

@ Guillaume Polet, cảm ơn sự giúp đỡ tuyệt vời của bạn – NoNaMe

Trả lời

13

gì bạn thực sự thiếu là một thành phần cha mẹ để hiển thị PopupMenu của bạn. Một cách để đạt được điều này, là sử dụng một "vô hình" khung (trên thực tế nó được nhìn thấy nhưng với 0-bounds và undecorated, vì vậy bạn không thể nhìn thấy nó) như thế này:

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; 
    } 
} 

Tính đến Java 1.7, bạn có thể thêm dòng sau để loại bỏ thanh ứng dụng từ thanh tác vụ:

frame.setType(Type.UTILITY); 
+0

nó hoạt động tốt nhưng khi tôi nhấp chuột phải vào biểu tượng và sau đó khi tôi nhấp chuột trái vào biểu tượng, bằng cách nhấp chuột trái nếu đưa ra Ngoại lệ: java.lang.IllegalArgumentException: nguồn gốc không trong thứ bậc cha mẹ \t tại java.awt.PopupMenu.show (Unknown Source) \t tại com.MyTaskTray $ 1.mouseClicked (MyTaskTray.java:66) \t tại java.awt.TrayIcon.processMouseEvent (Unknown Source) \t tại java.awt.TrayIcon.processEvent (Nguồn không xác định) \t tại java.awt.TrayIcon.dispatchEvent (Nguồn không xác định) – NoNaMe

+0

@Farid thực sự nó gây ra vấn đề, tôi đã bỏ lỡ điều đó. Giải pháp là thêm popup vào 'frame' ngay trước khi hiển thị popup. Tôi đã cập nhật bài đăng của mình để phản ánh điều đó. –

+0

điều này giải quyết vấn đề của tôi và làm việc tốt, nhưng có một điều sẽ tốt cho người dùng sử dụng nó trong thời gian tới nếu chúng ta sử dụng JDialog thay cho Frame nó sẽ trở nên tốt hơn vì nó sẽ không hiển thị Frame trên thanh start – NoNaMe

2

Tôi nghĩ rằng bạn đang tìm kiếm một MouseListener mà bạn sẽ thêm vào TrayIcon của bạn và sẽ kích hoạt khi một nút trên chuột được nhấp, chuyển vv Để làm cho nó hoạt động cho các nhấp chuột trái chỉ có một cái nhìn tại các ButtonMasks trên MouseEvent (BUTTON1) dành cho các nhấp chuột trái.

+1

Liên kết bạn thêm là dành cho C# không phải Java –

4

bạn có thể thêm ActionListener đến TrayIcon, chuột double_click thể thấy JOptionPane

trayIcon.addActionListener(new ActionListener() { 

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

@Farid không quan trọng, nếu menu bật lên, cửa sổ bật lên hoặc hộp thoại – mKorbel

+0

Tôi không gặp vấn đề gì với mã của bạn, trình tăng tốc JPopupMenu cho 'setPopupMenu()' là nút chuột phải, sử dụng [show (Invoker Component, int x, int y)] (http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html) – mKorbel

1

Bạn có thể đọc hướng dẫn chính thức tại http://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html hoặc kiểm tra http://weblogs.java.net/blog/ixmal/archive/2006/05/using_jpopupmen.html kiếm một giải pháp để sử dụng một jpopuomenu thay

+0

đã kiểm tra ví dụ này , nó có 2 vấn đề, 1 nó cũng hoạt động cho nhấp chuột phải không cho trái và thứ 2 khi nó hiển thị menu popup mà không bị xóa ... và ví dụ thứ nhất u đã làm việc cho nhấp chuột phải chỉ tôi cũng sử dụng cái này cho đúng nhấp chuột. nhưng tôi phải hiển thị cùng một popup trên nhấp chuột trái – NoNaMe

1

này nên làm việc:

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

Override bất kỳ phương pháp khác nếu bạn muốn có một loại khác nhau của sự kiện (không chỉ là nhấp chuột sự kiện từ ví dụ ở trên).