2012-10-01 30 views
14

मैं एक TrayIcon (यानीsystemTray.add(trayIcon)) के रूप में कार्य पट्टी करने के लिए JPopupMenu जोड़ना चाहते हैं JPopupMenu जोड़ा जा रहा है, लेकिन मैं so.From docs trayicon के निर्माता की तरह दिखता है इसके लिए कोई तरीका नहीं मिला है:trayicon

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

क्या कोई तरीका है कि मैं ऐसा कर सकता हूं?

+8

मेरी दुनिया में आपका स्वागत है। यह निराशाजनक है कि इसे कैसे लागू नहीं किया गया है। कोई भी कम नहीं, आपको ट्रेयिकॉन में जेपीओपअपमेनू का उपयोग करना पड़ सकता है (http://weblogs.java.net/blog/ixmal/archive/2006/05/using_jpopupmen.html) ब्याज – MadProgrammer

+0

एक माउस लिस्टनर का उपयोग करें और माउस पर काम कर रहे हैं जाने का रास्ता है। आप [इस उत्तर] पर भी एक नज़र डाल सकते हैं (http://stackoverflow.com/questions/12638845/adding-a-vertical-separator-in-popupmenu-in-the-task-bar/12640454#12640454) जो है एक और उद्देश्य के लिए, लेकिन एक ट्रेपॉन पर एक जेपीओपअपमेनू भी प्रदर्शित करता है। –

उत्तर

-1

आप Oracle की ट्यूटोरियल और उदाहरण how to use the system tray

+1

दस्तावेज़/ट्यूटोरियल राज्यों के रूप में, ट्रेयॉन का समर्थन सीमित है और आज तक, जेपीओप्यूमेनू को सीधे कन्स्ट्रक्टर के माध्यम से ट्रेकॉन में जोड़ा नहीं जा सकता है, इसलिए डाउनवोट। – FaithReaper

0

मैं WinXp/Win7 (Win2003/2008) पर निर्माता सार्वजनिक TrayIcon(Image image, String tooltip, PopupMenu popup), nor is Java7 साथ किसी भी मुद्दे को नहीं देख सकता

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 एक JPopupMenu नहीं है, और इसलिए क्रियाओं जैसी चीजें नहीं कर सकता। –

2

पर गौर कर सकते वर्तमान TrayIcon के लिए कार्यान्वयन, JPopupMenu या JMenu से TrayIcon को सीधे जोड़ना संभव नहीं है। हालांकि, कुछ लोगों ने कस्टम MouseListener लागू करके इसके आसपास काम करने का प्रबंधन किया जो केवल Trayicon पर दायाँ क्लिक करने के लिए सुनता है। जब माउस राइट-क्लिक किया जाता है, तो पॉपअपमेनू का स्थान event.getXOnScreen() और event.getYOnScreen() पर सेट करें और इसे सेट करें।

5

यह एक ज्ञात समस्या है। bug report है, जिसमें वर्कअराउंड की रूपरेखा शामिल है। मैंने इसे नीचे अनुकूलित किया है:

// 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 (नया माउस एडाप्टर() {' जावा 1.8.111 पर संकलित नहीं है। 'माउसलिस्टर() ' – FaithReaper

+0

में बदलने की आवश्यकता है यह अजीब बात है; जावा 8 माउस एडाप्टर को क्यों अस्वीकार करेगा? –

+0

वैसे भी, ऐसा लगता है कि ऐसा लगता है इस समाधान के साथ समस्या: जब आप इसके बाहर क्लिक करते हैं तो पॉपअप बंद नहीं किया जा रहा है। –