Swing/SystemTray のバックアップ(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/SystemTray へ行く。
- 1 (2007-05-08 (火) 20:23:38)
- 2 (2007-05-08 (火) 21:41:13)
- 3 (2007-05-09 (水) 13:54:25)
- 4 (2007-10-20 (土) 02:53:45)
- 5 (2009-04-13 (月) 14:23:41)
- 6 (2009-12-08 (火) 09:28:46)
- 7 (2010-03-05 (金) 21:05:36)
- 8 (2010-03-06 (土) 23:22:39)
- 9 (2010-03-08 (月) 17:28:43)
- 10 (2010-03-09 (火) 16:26:47)
- 11 (2010-09-30 (木) 18:16:34)
- 12 (2011-03-23 (水) 13:23:06)
- 13 (2013-02-09 (土) 23:46:19)
- 14 (2014-11-01 (土) 00:46:09)
- 15 (2014-12-25 (木) 16:24:23)
- 16 (2015-01-12 (月) 02:13:46)
- 17 (2015-04-01 (水) 20:10:37)
- 18 (2015-04-07 (火) 19:54:18)
- 19 (2016-09-06 (火) 12:53:43)
- 20 (2016-11-18 (金) 14:59:16)
- 21 (2017-11-02 (木) 15:34:40)
- 22 (2017-11-22 (水) 15:30:29)
- 23 (2019-06-25 (火) 16:04:37)
- 24 (2021-03-07 (日) 18:24:18)
- 25 (2022-08-20 (土) 22:15:25)
TITLE:SystemTrayにアイコンを表示
Posted by terai at 2007-03-05
SystemTrayにアイコンを表示
JDK 6 で追加された機能を使って、SystemTrayにアイコンを表示します。
- &jar;
- &zip;
#screenshot
サンプルコード
public MainPanel(final JFrame frame) {
super();
if(!SystemTray.isSupported()) {
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
return;
}
frame.addWindowStateListener(new WindowAdapter() {
public void windowIconified(WindowEvent e) {
frame.dispose();
}
});
final SystemTray tray = SystemTray.getSystemTray();
final Image image = new ImageIcon(
getClass().getResource("16x16.png")).getImage();
final PopupMenu popup = new PopupMenu();
final TrayIcon icon = new TrayIcon(image, "TRAY", popup);
MenuItem item1 = new MenuItem("OPEN");
item1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.setVisible(true);
}
});
MenuItem item2 = new MenuItem("EXIT");
item2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tray.remove(icon);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.dispose();
//System.exit(0);
}
});
popup.add(item1);
popup.add(item2);
try{
tray.add(icon);
}catch(AWTException e) {
e.printStackTrace();
}
}
解説
トレイアイコンでは、JPopupMenuではなく、PopupMenuやMenuItemを使用します。
上記のサンプルでは、フレームがアイコン化(最小化)されたときにタスクバーの表示を消して、システムトレイにアイコンだけ表示したいので、初期状態をframe.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);にしておき、アイコン化された場合でも、frame.dispose();するようにしています。
実際にVMを終了する場合は、表示可能なウィンドウをすべて破棄して(frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);)、システムトレイからもtray.remove(icon);してアイコンを取り除けばいいようです。
参考リンク
コメント
- Ubuntu だと通知スペースに表示されるのですが、背景色や位置がどうもうまくいっていないようです。 -- terai
- 位置は以下みたいにすれば適当に補正できそうですが、背景色はどうしたらいいんだろう? g.setColor(UIManager.getColor("Panel.background"));g.fillRect(0,0,d.width,d.height);とかするのは酷いか…。 -- terai
SystemTray tray = SystemTray.getSystemTray(); Dimension d = tray.getTrayIconSize(); //Image image = new ImageIcon(getClass().getResource("16x16.png")).getImage(); BufferedImage image = new BufferedImage(d.width,d.height,BufferedImage.TYPE_INT_ARGB); ImageIcon i = new ImageIcon(getClass().getResource("16x16.png")); Graphics g = image.createGraphics(); i.paintIcon(null,g,(d.width-i.getIconWidth())/2,(d.height-i.getIconWidth())/2); g.dispose(); PopupMenu popup = new PopupMenu(); TrayIcon icon = new TrayIcon(image, "TRAY", popup);
- g.setBackground(new Color(0,0,0,0));g.clearRect(0,0,d.width,d.height);とかしても変化無し。 -- terai
- 位置は以下みたいにすれば適当に補正できそうですが、背景色はどうしたらいいんだろう? g.setColor(UIManager.getColor("Panel.background"));g.fillRect(0,0,d.width,d.height);とかするのは酷いか…。 -- terai
- メモ: TrayIcon does not support 8-bit alpha channel in Windows XP -- terai
- タスクバーのアイコンがなくなりシステムトレイのアイコンだけになりませんか? --
- Windowsでしか試していませんが、JFrameの代わりに、JDialogを使えばタスクバーには何も表示されないと思います(質問の意味を取り違えてなければいいのですが……)。 -- terai
- 消したいのはタイトルバーではなくてシステムトレイの隣のタスクバーアイコンです。文字で伝えるのは難しいですね。 --
- スクリーンショットでJSTシステムトレイとタスクバーにあるやつです --
- なら、JFrameの代わりに、JDialogを使えば表示されないはずです。 -- terai