2012-07-11 45 views
12

Estoy trabajando en la bandeja de tareas Icono en java, me gusta abrir un menú emergente usando el botón izquierdo del mismo menú emergente que abro al hacer clic derecho, y por favor ayuda yo con una respuesta rápida.Abrir ventana emergente (Menú) en el icono de la bandeja de tareas con clic izquierdo usando java

Gracias de antemano ...

aquí está funcionando el código de botón derecho del ratón necesitan mostrar misma ventana emergente en la izquierda haga clic ... no se olvide de colocar cualquier imagen @ "img src /" carpeta con nombrar "titleImg.jpg"

Simplemente ejecute este ... es un ejemplo de trabajo, pero tengo que mostrar misma emergente usando el clic izquierdo

he comprobado el ratón Listener, se escucha el clic izquierdo en el icono de la bandeja pero ¿cómo mostrar el menú emergente usando eso?

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

¿Qué tienes hasta ahora? –

+1

Ver mi respuesta a continuación –

+0

@ Guillaume Polet, gracias por su gran ayuda – NoNaMe

Respuesta

13

Lo que de hecho, la falta es un componente principal para mostrar tu PopupMenu. Una forma de lograr esto, es utilizar un marco de "invisible" (en realidad es visible, pero con 0-límites y sin decorar, por lo que no puede ver) así:

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

A partir de Java 1.7, puede añadir la siguiente línea para quitar la barra de aplicaciones desde la barra de tareas:

frame.setType(Type.UTILITY); 
+0

, está funcionando bien, pero cuando hago clic derecho en el icono y luego de eso, cuando lo dejo, haga clic en el icono, haciendo clic a la izquierda si aparece la excepción: java.lang.IllegalArgumentException: no origen en la jerarquía de los padres \t en java.awt.PopupMenu.show (origen desconocido) \t en com.MyTaskTray $ 1.mouseClicked (MyTaskTray.java:66) \t en java.awt.TrayIcon.processMouseEvent (origen desconocido) \t en java.awt.TrayIcon.processEvent (Fuente desconocida) \t en java.awt.TrayIcon.dispatchEvent (Fuente desconocida) – NoNaMe

+0

@Farid de hecho causa un problema, lo eché de menos. La solución es agregar la ventana emergente al 'frame' justo antes de mostrar la ventana emergente. He actualizado mi publicación para reflejar eso. –

+0

esto resolvió mi problema y funciona bien, pero hay una cosa que será buena para el usuario la próxima vez que si usamos JDialog en lugar de Frame será más útil ya que no mostrará el Frame en la barra de inicio – NoNaMe

2

creo que busca un MouseListener que se sumará a su TrayIcon y se activará cuando se hace clic en un botón en el ratón, se trasladó etc. Para conseguir que funcione por los clics dejó sólo echar un vistazo a el ButtonMasks en MouseEvent (BUTTON1) para clics izquierdos del mouse.

+1

El enlace que ha añadido es para C# no Java –

4

puede agregar ActionListener a la TrayIcon, DOUBLE_CLICK ratón puede mostrar JOptionPane

trayIcon.addActionListener(new ActionListener() { 

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

@Farid no importa, si el menú emergente, ventana emergente o diálogo – mKorbel

+0

No tengo ningún problema con su código, JPopupMenu acelerador para 'setPopupMenu()' es botón derecho del mouse, use [show (Component invoker, int x, int y)] (http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html) – mKorbel

1

Se podía leer el tutorial oficial en http://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html o echa un vistazo http://weblogs.java.net/blog/ixmal/archive/2006/05/using_jpopupmen.html de una solución para utilizar un jpopuomenu lugar

+0

ya comprobado este ejemplo , tiene 2 problemas, primero también funciona para el clic derecho no para el izquierdo y el 2º cuando muestra el menú emergente que el menú no se elimina ... y el 1er ejemplo que dio los trabajos para el clic derecho solamente también lo usé para el derecho hacer clic. pero tengo que mostrar la misma ventana emergente en el clic izquierdo – NoNaMe

1

esto debería funcionar:

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

Anular cualquier otro método si quieres otro tipo de evento (no sólo el clic evento del ejemplo encima).

Cuestiones relacionadas