package com.jds.swing; import javax.swing.*; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** * User: VISTALL * I not a author. @author INTERNET * Company: J Develop Station * Date: 20.09.2009 * Time: 22:53:16 */ public class JTrayIcon extends TrayIcon { private JPopupMenu menu; private static JDialog dialog; static { dialog = new JDialog((Frame) null); dialog.setUndecorated(true); dialog.setAlwaysOnTop(true); } private static PopupMenuListener popupListener = new PopupMenuListener() { public void popupMenuWillBecomeVisible(PopupMenuEvent e) { } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { dialog.setVisible(false); } public void popupMenuCanceled(PopupMenuEvent e) { dialog.setVisible(false); } }; public JTrayIcon(Image image) { super(image); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { showJPopupMenu(e); } public void mouseReleased(MouseEvent e) { showJPopupMenu(e); } }); } protected void showJPopupMenu(MouseEvent e) { if (e.isPopupTrigger() && menu != null) { Dimension size = menu.getPreferredSize(); showJPopupMenu(e.getX(), e.getY() - size.height); } } public void setJPopupMenu(JPopupMenu menu) { if (this.menu != null) { this.menu.removePopupMenuListener(popupListener); } this.menu = menu; menu.addPopupMenuListener(popupListener); } protected void showJPopupMenu(int x, int y) { dialog.setLocation(x, y); dialog.setVisible(true); menu.show(dialog.getContentPane(), 0, 0); // popup works only for focused windows dialog.toFront(); } }