---
category: swing
folder: FrameIcon
title: JFrameのIconを変更
tags: [JFrame, Icon, Image]
author: aterai
pubdate: 2004-08-30T05:11:06+09:00
description: JFrameのタイトルバー左に表示されているアイコンを別の画像に変更します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTNO_p95yI/AAAAAAAAAac/gl0vOOoKH14/s800/FrameIcon.png
---
* Summary [#summary]
`JFrame`のタイトルバー左に表示されているアイコンを別の画像に変更します。
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTNO_p95yI/AAAAAAAAAac/gl0vOOoKH14/s800/FrameIcon.png)
* Source Code Examples [#sourcecode]
#code(link){{
MainPanel panel = new MainPanel();
URL url = panel.getClass().getResource("16x16.png");
JFrame frame = new JFrame();
frame.setIconImage(Toolkit.getDefaultToolkit().createImage(url));
}}
* Description [#explanation]
* Description [#description]
`JFrame#setIconImage`メソッドで`JFrame`のタイトルバーなどに表示される画像を設定しています。
- サンプル画像としてサイズ`16x16`の透過`PNG`を使用
- `JDK 1.6.0`から、[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JFrame.html#setIconImage-java.awt.Image- JFrame#setIconImage(Image)]メソッドは[https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Window.html#setIconImage-java.awt.Image- Window#setIconImage(Image)]メソッドを使用するようになった
- また`JDK 1.6.0`から[https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Window.html#setIconImages-java.util.List- Window#setIconImages(List<? extends Image>)]メソッドで複数のイメージを設定可能になった
-- 同サイズのイメージがある場合は、先頭から検索して最初のイメージが使用される
-- どのサイズのイメージが使用されるかは環境に依存する
-- 参考: [https://stackoverflow.com/questions/18224184/sizes-of-frame-icons-used-in-swing java - Sizes of frame icons used in Swing - Stack Overflow]
-- `Window#setIconImage(Image)`と`Window#setIconImages(List<? extends Image>)`を両方使用した場合、後に実行したメソッドの設定が有効になる
--- たとえば以下のコードの場合、タイトルバーのアイコンは`ATTACHMENT_16x16-32.png`になる
#code{{
Toolkit tk = Toolkit.getDefaultToolkit();
frame.setIconImage(tk.createImage(MainPanel.class.getResource("RECYCLE BIN - EMPTY_16x16-32.png")));
frame.setIconImages(java.util.Arrays.asList(
tk.createImage(MainPanel.class.getResource("ATTACHMENT_16x16-32.png")),
tk.createImage(MainPanel.class.getResource("wi0054-32.png"))));
}}
----
- `JFrame.setDefaultLookAndFeelDecorated(true);`でデフォルト`LookAndFeel`のウィンドウ修飾をタイトルバーに適用する場合、`JFrame#setIconImage(...)`で設定したアイコンが透過されない
-- [https://bugs.openjdk.org/browse/JDK-6429220 JDK-6429220 Default LAF decorated frame does not support transparent icons - Java Bug System]
#code{{
import java.awt.*;
import javax.swing.*;
public class TransparentIconTest {
public static void main(String[] args) {
EventQueue.invokeLater(() -> createAndShowGui());
}
public static void createAndShowGui() {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
ImageIcon icon = new ImageIcon(
TransparentIconTest.class.getResource("16x16.png"));
f.setIconImage(icon.getImage());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
}}
* Reference [#reference]
- [https://stackoverflow.com/questions/18224184/sizes-of-frame-icons-used-in-swing java - Sizes of frame icons used in Swing - Stack Overflow]
* Comment [#comment]
#comment
- %%`JDK 1.6.0`で試すとアイコンの表示が乱れる? -- &user(aterai); &new{2006-06-29 (木) 17:57:16};%%
#comment