org.jdesktop.swinghelper.tray.JXTrayIcon Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2008 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jdesktop.swinghelper.tray;
import javax.swing.*;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.PopupMenuEvent;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class JXTrayIcon extends TrayIcon {
private JPopupMenu menu;
private static JDialog dialog;
static {
dialog = new JDialog((Frame) null, "TrayDialog");
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 JXTrayIcon(Image image) {
super(image);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
showJPopupMenu(e);
}
public void mouseReleased(MouseEvent e) {
showJPopupMenu(e);
}
});
}
private void showJPopupMenu(MouseEvent e) {
if (e.isPopupTrigger() && menu != null) {
Dimension size = menu.getPreferredSize();
dialog.setLocation(e.getX(), e.getY() - size.height);
dialog.setVisible(true);
menu.show(dialog.getContentPane(), 0, 0);
// popup works only for focused windows
dialog.toFront();
}
}
public JPopupMenu getJPopuMenu() {
return menu;
}
public void setJPopuMenu(JPopupMenu menu) {
if (this.menu != null) {
this.menu.removePopupMenuListener(popupListener);
}
this.menu = menu;
menu.addPopupMenuListener(popupListener);
}
private static void createGui() {
JXTrayIcon tray = new JXTrayIcon(createImage());
tray.setJPopuMenu(createJPopupMenu());
try {
SystemTray.getSystemTray().add(tray);
} catch (AWTException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createGui();
}
});
}
static Image createImage() {
BufferedImage i = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D) i.getGraphics();
g2.setColor(Color.RED);
g2.fill(new Ellipse2D.Float(0, 0, i.getWidth(), i.getHeight()));
g2.dispose();
return i;
}
static JPopupMenu createJPopupMenu() {
final JPopupMenu m = new JPopupMenu();
m.add(new JMenuItem("Item 1"));
m.add(new JMenuItem("Item 2"));
JMenu submenu = new JMenu("Submenu");
submenu.add(new JMenuItem("item 1"));
submenu.add(new JMenuItem("item 2"));
submenu.add(new JMenuItem("item 3"));
m.add(submenu);
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
m.add(exitItem);
return m;
}
}