在某些情况下,以输出闪烁的图标更改图标没有问题
创建一个
Arrays of BufferedImage
或队列在所需事件上启动Swing计时器,并在一段时间内更改
BufferedImage
或图标并停止
Swing Timer
一段时间后残留或添加ActionListener
到Message
,另一种方式可以是确定LEFT
或RIGHT
从鼠标按钮MouseListener
(用于Icon
在System Tray
)一个用于停止Timer
,对于第二JPopup
编辑
例如,正如我提到的,您可以添加ActionListener或MouseListener,在那里可以停止Swing
Timer
import java.awt.AWTException;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 java.util.logging.Level;import java.util.logging.Logger;import javax.swing.AbstractAction;import javax.swing.Action;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.SwingUtilities;import javax.swing.Timer;import javax.swing.UIManager;public class ActiveTray { private SystemTray tray; private TrayIcon trayIcon; private Icon icon, icon1; private Image image, image1; private Timer timer; public ActiveTray() { if (SystemTray.isSupported() == false) { System.err.println("No system tray available"); return; } 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 = new BevelArrowIcon(BevelArrowIcon.UP, false, false); image = iconToImage(icon); icon1 = new BevelArrowIcon(BevelArrowIcon.DOWN, false, false); image1 = iconToImage(icon1); PopupMenu popup = new PopupMenu(); MenuItem item = new MenuItem("Hello, World"); 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); try { tray.add(trayIcon); start(); } catch (AWTException ex) { Logger.getLogger(ActiveTray.class.getName()).log(Level.SEVERE, null, ex); } } private void start() { timer = new javax.swing.Timer(125, updateCol()); timer.start(); trayIcon.displayMessage(null, " Aplication Loaded ", TrayIcon.MessageType.NONE); } private Action updateCol() { return new AbstractAction("Icon load action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { Runnable doRun = new Runnable() { @Override public void run() { Image img = trayIcon.getImage(); if (img == image) { trayIcon.setImage(image1); } else { trayIcon.setImage(image); } } }; SwingUtilities.invokeLater(doRun); } }; } public static void main(String args[]) { ActiveTray activeTray = new ActiveTray(); } 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); } }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)