Java 将JPOppMenu添加到TrayIcon

Java 将JPOppMenu添加到TrayIcon,java,swing,system-tray,trayicon,jpopupmenu,Java,Swing,System Tray,Trayicon,Jpopupmenu,我想将jpopumenu作为TrayIcon(即systemTray.add(TrayIcon))添加到任务栏,但我还没有找到这样做的方法。从 public TrayIcon(Image image, String tooltip, PopupMenu popup) 有什么方法可以做到这一点吗?您可以查看Oracle的教程和示例在WinXp/Win7(Win2003/2008)上,我看不到公共构造函数有任何问题 导入java.awt.Color;

我想将
jpopumenu
作为
TrayIcon
systemTray.add(TrayIcon)
)添加到任务栏,但我还没有找到这样做的方法。从

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

有什么方法可以做到这一点吗?

您可以查看Oracle的教程和示例

在WinXp/Win7(Win2003/2008)上,我看不到公共构造函数有任何问题

导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.GraphicsConfiguration;
导入java.awt.GraphicsDevice;
导入java.awt.GraphicsEnvironment;
导入java.awt.Image;
导入java.awt.MenuItem;
导入java.awt.PopupMenu;
导入java.awt.SystemTray;
导入java.awt.TrayIcon;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入javax.swing.Icon;
导入javax.swing.ImageIcon;
导入javax.swing.UIManager;
公共类活动托盘{
公共静态void main(字符串args[])引发异常{
if(SystemTray.isSupported()==false){
System.err.println(“没有可用的系统托盘”);
返回;
}
最终SystemTray=SystemTray.getSystemTray();
PropertyChangeListener propListener=新的PropertyChangeListener(){
公共作废属性更改(属性更改事件evt){
TrayIcon oldTray[]=(TrayIcon[])evt.getOldValue();
TrayIcon newTray[]=(TrayIcon[])evt.getNewValue();
System.out.println(oldTray.length+“/”+newTray.length);
}
};
tray.addPropertyChangeListener(“trayIcons”,propListener);
图标图标=新的BevelArrowIcon(BevelArrowIcon.UP,false,false);
图像图像=图标图像(图标);
PopupMenu popup=新建PopupMenu();
MenuItem=新MenuItem(“你好,世界”);
最终TrayIcon TrayIcon=新TrayIcon(图像,“提示文本”,弹出窗口);
ActionListener menuActionListener=新建ActionListener(){
已执行的公共无效操作(操作事件e){
trayIcon.displayMessage(“再见”,“残酷的世界”,
TrayIcon.MessageType.WARNING);
}
};
item.addActionListener(menuActionListener);
弹出。添加(项目);
ActionListener ActionListener=新建ActionListener(){
已执行的公共无效操作(操作事件e){
托盘。移除(trayIcon);
}
};
trayIcon.addActionListener(actionListener);
托盘。添加(trayIcon);
}
静态图像图标图标(图标图标){
如果(图像图标的图标实例){
返回((ImageIcon)图标).getImage();
}否则{
int w=icon.getIconWidth();
inth=icon.getIconHeight();
图形环境=
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd=ge.getDefaultScreenDevice();
GraphicsConfiguration gc=gd.getDefaultConfiguration();
BuffereImage image=gc.createCompatibleImage(w,h);
Graphics2D g=image.createGraphics();
icon.paintIcon(null,g,0,0);
g、 处置();
返回图像;
}
}
静态类BevelArrowIcon实现Icon{
公共静态final int UP=0;//方向
公共静态最终整数下降=1;
私有静态最终int默认值_SIZE=16;
私密色边1;
私人彩色边缘2;
私人色彩填充;
私有整数大小;
私人int方向;
公共斜面箭头图标(整数方向,布尔isRaisedView,
布尔值(isPressedView){
如果(isRaisedView){
如果(isPressedView){
init(UIManager.getColor(“ControlThighlight”),
UIManager.getColor(“controlDkShadow”),
UIManager.getColor(“controlShadow”),
默认值(单位大小、方向);
}否则{
init(UIManager.getColor(“controlHighlight”),
UIManager.getColor(“controlShadow”),
UIManager.getColor(“控件”),
默认值(单位大小、方向);
}
}否则{
如果(isPressedView){
init(UIManager.getColor(“controlDkShadow”),
UIManager.getColor(“ControlThighlight”),
UIManager.getColor(“controlShadow”),
默认值(单位大小、方向);
}否则{
init(UIManager.getColor(“controlShadow”),
UIManager.getColor(“controlHighlight”),
UIManager.getColor(“控件”),
默认值(单位大小、方向);
}
}
}
公共斜面箭头图标(彩色边1、彩色边2、彩色填充、,
整数大小,整数方向){
初始(边1、边2、填充、尺寸、方向);
}
@凌驾
公共虚空绘制图标(组件c、图形g、整数x、整数y){
开关(方向){
按大小写:
下拉箭头(g,x,y);
打破
个案:
拉深箭头(g,x,y);
打破
}
}
@凌驾
public int getIconWidth(){
返回大小;
}
@凌驾
public int getIconHeight(){
返回大小;
}
专用void init(颜色边1、颜色边2、颜色填充、,
整数大小,整数方向){
边1=颜色。红色;
边2=颜色。蓝色;
这是edge1
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);
        }
    }
}
// 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);
        }
    }
});