2012-10-01 15 views
14

Ich möchte JPopupMenu in die Taskleiste hinzuzufügen, als TrayIcon (dhsystemTray.add(trayIcon)), aber ich habe nicht einen Weg zu tun so.From die docs der Konstruktor von TrayIcon sieht aus wie gefunden:Hinzufügen JPopupMenu zum TrayIcon

public TrayIcon(Image image, 
      String tooltip, 
      PopupMenu popup) 

Gibt es eine Möglichkeit, das kann ich tun?

+8

Willkommen in meiner Welt. Es ist frustrierend, wie dies nicht umgesetzt wurde. Nichtsdestoweniger finden Sie [Using JPopupMenu in TrayIcon] (http://weblogs.java.net/blog/ixmal/archive/2006/05/using_jpopupmen.html) von Interesse – MadProgrammer

+0

Usin einem MouseListener und handelnd auf MouseReleased ist der Weg zu gehen. Sie können sich auch [diese Antwort] ansehen (http://stackoverflow.com/questions/12638845/adding-a-vertical-separator-in-popupmenu-in-the-task-bar/12640454#12640454) was ist für einen anderen Zweck aber zeigt auch ein JPopupMenu auf einem TrayIcon an. –

Antwort

-1

Sie in Oracle Tutorial schauen und Beispiel how to use the system tray

+1

Wie Doc/tutorial, die Unterstützung von TrayIcon ist begrenzt und bis heute kann JPopupMenu nicht direkt über Konstruktor in TrayIcon hinzugefügt werden, so der Downvote. – FaithReaper

0

ich keine Probleme mit Konstruktor public TrayIcon(Image image, String tooltip, PopupMenu popup), nor is Java7 auf WinXp/Win7 (Win2003/2008)

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Image; 
import java.awt.MenuItem; 
import java.awt.PopupMenu; 
import java.awt.SystemTray; 
import java.awt.TrayIcon; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.UIManager; 

public class ActiveTray { 

    public static void main(String args[]) throws Exception { 
     if (SystemTray.isSupported() == false) { 
      System.err.println("No system tray available"); 
      return; 
     } 
     final SystemTray tray = SystemTray.getSystemTray(); 
     PropertyChangeListener propListener = new PropertyChangeListener() { 

      public void propertyChange(PropertyChangeEvent evt) { 
       TrayIcon oldTray[] = (TrayIcon[]) evt.getOldValue(); 
       TrayIcon newTray[] = (TrayIcon[]) evt.getNewValue(); 
       System.out.println(oldTray.length + "/" + newTray.length); 
      } 
     }; 
     tray.addPropertyChangeListener("trayIcons", propListener); 
     Icon icon = new BevelArrowIcon(BevelArrowIcon.UP, false, false); 
     Image image = iconToImage(icon); 
     PopupMenu popup = new PopupMenu(); 
     MenuItem item = new MenuItem("Hello, World"); 
     final TrayIcon trayIcon = new TrayIcon(image, "Tip Text", popup); 
     ActionListener menuActionListener = new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       trayIcon.displayMessage("Good-bye", "Cruel World", 
         TrayIcon.MessageType.WARNING); 
      } 
     }; 
     item.addActionListener(menuActionListener); 
     popup.add(item); 
     ActionListener actionListener = new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       tray.remove(trayIcon); 
      } 
     }; 
     trayIcon.addActionListener(actionListener); 
     tray.add(trayIcon); 
    } 

    static Image iconToImage(Icon icon) { 
     if (icon instanceof ImageIcon) { 
      return ((ImageIcon) icon).getImage(); 
     } else { 
      int w = icon.getIconWidth(); 
      int h = icon.getIconHeight(); 
      GraphicsEnvironment ge = 
        GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      GraphicsDevice gd = ge.getDefaultScreenDevice(); 
      GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
      BufferedImage image = gc.createCompatibleImage(w, h); 
      Graphics2D g = image.createGraphics(); 
      icon.paintIcon(null, g, 0, 0); 
      g.dispose(); 
      return image; 
     } 
    } 

    static class BevelArrowIcon implements Icon { 

     public static final int UP = 0;   // direction 
     public static final int DOWN = 1; 
     private static final int DEFAULT_SIZE = 16; 
     private Color edge1; 
     private Color edge2; 
     private Color fill; 
     private int size; 
     private int direction; 

     public BevelArrowIcon(int direction, boolean isRaisedView, 
       boolean isPressedView) { 
      if (isRaisedView) { 
       if (isPressedView) { 
        init(UIManager.getColor("controlLtHighlight"), 
          UIManager.getColor("controlDkShadow"), 
          UIManager.getColor("controlShadow"), 
          DEFAULT_SIZE, direction); 
       } else { 
        init(UIManager.getColor("controlHighlight"), 
          UIManager.getColor("controlShadow"), 
          UIManager.getColor("control"), 
          DEFAULT_SIZE, direction); 
       } 
      } else { 
       if (isPressedView) { 
        init(UIManager.getColor("controlDkShadow"), 
          UIManager.getColor("controlLtHighlight"), 
          UIManager.getColor("controlShadow"), 
          DEFAULT_SIZE, direction); 
       } else { 
        init(UIManager.getColor("controlShadow"), 
          UIManager.getColor("controlHighlight"), 
          UIManager.getColor("control"), 
          DEFAULT_SIZE, direction); 
       } 
      } 
     } 

     public BevelArrowIcon(Color edge1, Color edge2, Color fill, 
       int size, int direction) { 
      init(edge1, edge2, fill, size, direction); 
     } 

     @Override 
     public void paintIcon(Component c, Graphics g, int x, int y) { 
      switch (direction) { 
       case DOWN: 
        drawDownArrow(g, x, y); 
        break; 
       case UP: 
        drawUpArrow(g, x, y); 
        break; 
      } 
     } 

     @Override 
     public int getIconWidth() { 
      return size; 
     } 

     @Override 
     public int getIconHeight() { 
      return size; 
     } 

     private void init(Color edge1, Color edge2, Color fill, 
       int size, int direction) { 
      edge1 = Color.red; 
      edge2 = Color.blue; 
      this.edge1 = edge1; 
      this.edge2 = edge2; 
      this.fill = fill; 
      this.size = size; 
      this.direction = direction; 
     } 

     private void drawDownArrow(Graphics g, int xo, int yo) { 
      g.setColor(edge1); 
      g.drawLine(xo, yo, xo + size - 1, yo); 
      g.drawLine(xo, yo + 1, xo + size - 3, yo + 1); 
      g.setColor(edge2); 
      g.drawLine(xo + size - 2, yo + 1, xo + size - 1, yo + 1); 
      int x = xo + 1; 
      int y = yo + 2; 
      int dx = size - 6; 
      while (y + 1 < yo + size) { 
       g.setColor(edge1); 
       g.drawLine(x, y, x + 1, y); 
       g.drawLine(x, y + 1, x + 1, y + 1); 
       if (0 < dx) { 
        g.setColor(fill); 
        g.drawLine(x + 2, y, x + 1 + dx, y); 
        g.drawLine(x + 2, y + 1, x + 1 + dx, y + 1); 
       } 
       g.setColor(edge2); 
       g.drawLine(x + dx + 2, y, x + dx + 3, y); 
       g.drawLine(x + dx + 2, y + 1, x + dx + 3, y + 1); 
       x += 1; 
       y += 2; 
       dx -= 2; 
      } 
      g.setColor(edge1); 
      g.drawLine(xo + (size/2), yo + size - 1, xo 
        + (size/2), yo + size - 1); 
     } 

     private void drawUpArrow(Graphics g, int xo, int yo) { 
      g.setColor(edge1); 
      int x = xo + (size/2); 
      g.drawLine(x, yo, x, yo); 
      x--; 
      int y = yo + 1; 
      int dx = 0; 
      while (y + 3 < yo + size) { 
       g.setColor(edge1); 
       g.drawLine(x, y, x + 1, y); 
       g.drawLine(x, y + 1, x + 1, y + 1); 
       if (0 < dx) { 
        g.setColor(fill); 
        g.drawLine(x + 2, y, x + 1 + dx, y); 
        g.drawLine(x + 2, y + 1, x + 1 + dx, y + 1); 
       } 
       g.setColor(edge2); 
       g.drawLine(x + dx + 2, y, x + dx + 3, y); 
       g.drawLine(x + dx + 2, y + 1, x + dx + 3, y + 1); 
       x -= 1; 
       y += 2; 
       dx += 2; 
      } 
      g.setColor(edge1); 
      g.drawLine(xo, yo + size - 3, xo + 1, yo + size - 3); 
      g.setColor(edge2); 
      g.drawLine(xo + 2, yo + size - 2, xo + size - 1, yo + size - 2); 
      g.drawLine(xo, yo + size - 1, xo + size, yo + size - 1); 
     } 
    } 
} 
+3

PopupMenu ist kein JPopupMenu und kann daher keine Aktionen ausführen. –

2

Für die aktuelle TrayIcon sehen Implementierung, ist es nicht möglich, direkt JPopupMenu oder JMenu zu TrayIcon hinzuzufügen. Einige Leute haben es jedoch geschafft, das Problem zu umgehen, indem sie eine benutzerdefinierte MouseListener implementieren, die nur mit der rechten Maustaste auf die Trayicon hört. Wenn die Maus mit der rechten Maustaste geklickt wird, legen Sie den Speicherort des Popup-Menüs unter event.getXOnScreen() und event.getYOnScreen() fest und setzen Sie es auf visible.

5

Dies ist ein bekanntes Problem. Es gibt eine bug report, die den Umriss einer Problemumgehung enthält. Ich habe das unten angepasst:

// Build your popup menu 
final JPopupMenu trayPopup = new JPopupMenu(); 
// I'm using actions, there are other ways of doing this. 
trayPopup.add(someFantaticAction); 

// Get your tray icon 
trayIcon = new TrayIcon(icon, "My awesome application"); 

trayIcon.addMouseListener(new MouseAdapter() { 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     maybeShowPopup(e); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     maybeShowPopup(e); 
    } 

    private void maybeShowPopup(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      trayPopup.setLocation(e.getX(), e.getY()); 
      trayPopup.setInvoker(trayPopup); 
      trayPopup.setVisible(true); 
     } 
    } 
}); 
+0

'trayIcon.addMouseListener (neues MouseAdapter() {' kompiliert nicht auf Java 1.8.111. Müssen zu 'MouseListener() 'wechseln. – FaithReaper

+0

Das ist komisch, warum würde Java 8 MouseAdapter ablehnen? –

+0

Wie auch immer, es scheint ein zu sein Problem mit dieser Lösung: Das Popup wird nicht geschlossen, wenn Sie darauf klicken. –