概要

JFrameのタイトルバー左に表示されているアイコンを別の画像に変更します。

サンプルコード

MainPanel panel = new MainPanel();
URL url = panel.getClass().getResource("16x16.png");
JFrame frame = new JFrame();
frame.setIconImage(Toolkit.getDefaultToolkit().createImage(url));
View in GitHub: Java, Kotlin

解説

JFrame#setIconImageメソッドでJFrameのタイトルバーなどに表示される画像を設定しています。

  • サンプル画像としてサイズ16x16の透過PNGを使用
  • JDK 1.6.0から、JFrame#setIconImage(Image)メソッドはWindow#setIconImage(Image)メソッドを使用するようになった
  • またJDK 1.6.0からWindow#setIconImages(List<? extends Image>)メソッドで複数のイメージを設定可能になった
    • 同サイズのイメージがある場合は、先頭から検索して最初のイメージが使用される
    • どのサイズのイメージが使用されるかは環境に依存する
    • 参考: java - Sizes of frame icons used in Swing - Stack Overflow
    • Window#setIconImage(Image)Window#setIconImages(List<? extends Image>)を両方使用した場合、後に実行したメソッドの設定が有効になる
      • たとえば以下のコードの場合、タイトルバーのアイコンはATTACHMENT_16x16-32.pngになる
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"))));

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);
  }
}

参考リンク

コメント