Swing/SystemTray のバックアップの現在との差分(No.7)
TITLE:SystemTrayにアイコンを表示
Posted by terai at 2007-03-05
SystemTrayにアイコンを表示
JDK 6 で追加された機能を使って、SystemTrayにアイコンを表示します。- category: swing folder: SystemTray title: SystemTrayにアイコンを表示 tags: [SystemTray, Icon] author: aterai pubdate: 2007-03-05T02:26:31+09:00 description: JDK 6で追加された機能を使って、SystemTrayにアイコンを表示します。 image:
概要
JDK 6
で追加された機能を使って、SystemTray
にアイコンを表示します。
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
public MainPanel(final JFrame frame) {
super();
if(!SystemTray.isSupported()) {
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);
SystemTray tray = SystemTray.getSystemTray();
Image image = new ImageIcon(getClass().getResource("16x16.png")).getImage();
PopupMenu popup = new PopupMenu();
TrayIcon icon = new TrayIcon(image, "TRAY", popup);
MenuItem item1 = new MenuItem("OPEN");
item1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@Override public void actionPerformed(ActionEvent e) {
frame.setVisible(true);
}
});
MenuItem item2 = new MenuItem("EXIT");
item2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@Override public void actionPerformed(ActionEvent e) {
tray.remove(icon);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.dispose();
//System.exit(0);
// System.exit(0);
}
});
popup.add(item1);
popup.add(item2);
try{
try {
tray.add(icon);
}catch(AWTException e) {
} catch (AWTException e) {
e.printStackTrace();
}
}
解説
トレイアイコンでは、JPopupMenuではなく、PopupMenuやMenuItemを使用します。解説
- デフォルトの
TrayIcon
では、JPopupMenu
ではなくPopupMenu
やMenuItem
が使用される - 上記のサンプルでは、フレームがアイコン化(最小化)されたときにタスクバーの表示を消して、システムトレイにアイコンだけ表示したいので、初期状態を
frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
にし、アイコン化された場合でもframe.dispose();
するように設定- 実際に
VM
を終了する場合は、表示可能なウィンドウをすべて破棄してからtray.remove(icon);
を実行してシステムトレイのアイコンを取り除く必要がある
- 実際に
参考リンク
実際にVMを終了する場合は、表示可能なウィンドウをすべて破棄して(frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);)、システムトレイからもtray.remove(icon);してアイコンを取り除けばいいようです。コメント
-
Ubuntu
だと通知スペースに表示されるのですが、背景色や位置がどうもうまくいっていないようです。 -- aterai- 位置は以下みたいにすれば適当に補正できそうですが、背景色はどうしたらいいんだろう?
g.setColor(UIManager.getColor("Panel.background"));g.fillRect(0,0,d.width,d.height);
とかするのは酷いか…。 -- aterai
- 位置は以下みたいにすれば適当に補正できそうですが、背景色はどうしたらいいんだろう?
参考リンク
コメント
- 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(); #spandel BufferedImage image = new BufferedImage(d.width,d.height,BufferedImage.TYPE_INT_ARGB); #spanend #spanadd BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_ARGB); #spanend ImageIcon i = new ImageIcon(getClass().getResource("16x16.png")); Graphics g = image.createGraphics(); #spandel i.paintIcon(null,g,(d.width-i.getIconWidth())/2,(d.height-i.getIconWidth())/2); #spanend #spanadd i.paintIcon(null, g, (d.width - i.getIconWidth()) / 2, (d.height - i.getIconWidth()) / 2); #spanend 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
-
g.setBackground(new Color(0x0, true)); g.clearRect(0, 0, d.width, d.height);
などを設定しても変化無し。 -- aterai
- メモ: TrayIcon does not support 8-bit alpha channel in Windows XP -- aterai
- タスクバーのアイコンがなくなりシステムトレイのアイコンだけになりませんか? --
-
Windows
でしか試していませんが、JFrame
の代わりに、JDialog
を使えばタスクバーには何も表示されないと思います(質問の意味を取り違えてなければいいのですが……)。 -- aterai
-
- 消したいのはタイトルバーではなくてシステムトレイの隣のタスクバーアイコンです。文字で伝えるのは難しいですね。 --
- スクリーンショットで
JST
システムトレイとタスクバーにあるやつです ---
JFrame
の代わりに、JWindow
を使うのはどうでしょうか。 -- aterai - もしくは、JFrameのアイコンを非表示のように透明なアイコンを設定する(クリックすると反応してしまいますが…)とか。 -- aterai
-
4
年以上前で、いまさら過ぎるのですが、やっと理解しました。自分の回答は的外れすぎですね。アイコン化したときにタスクバーボタンを非表示にするには、Window#dispose()
を実行するとよさそうです。このサンプルを修正して非表示にするよう変更しました。 -- aterai - TrayIconの使用中にJFrameを最小化したとき、タスクバーボタンを非表示にするに移動
-
- 間違えて、
Window#addWindowStateListener(...)
を使用していたので、Window#addWindowListener(...)
を使用するように修正。 -- aterai