Java Swing 視窗 (JFrame/JDialog) 預設顯示 Java 咖啡杯圖示。專業應用必須替換為品牌 Logo,提升辨識度。
適用於 Frame、Window 等 AWT 元件,也支援 Swing 視窗。
import java.awt.*;
import javax.swing.*;
public class CustomIconToolkit extends JFrame {
public CustomIconToolkit() {
setTitle("Toolkit 方案示範");
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// 核心程式碼:3 行搞定
Toolkit tk = Toolkit.getDefaultToolkit();
Image icon = tk.createImage("logo.png"); // 支援相對/絕對路徑、URL、資源流
setIconImage(icon);
setVisible(true);
}
public static void main(String[] args) {
new CustomIconToolkit();
}
}
優點:無需額外匯入 Swing 套件、支援 AWT/Swing 通用。
缺點:createImage 為非同步載入,圖示可能延遲顯示;需自行處理路徑解析。
ImageIcon 會同步載入圖片,確保圖示即時顯示,且支援 ClassLoader 載入資源 (JAR 內圖片)。
import javax.swing.*;
import java.awt.*;
public class CustomIconSwing extends JFrame {
public CustomIconSwing() {
super("ImageIcon 方案示範");
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// 方式 A:檔案系統路徑
// ImageIcon icon = new ImageIcon("resources/logo.png");
// 方式 B:ClassPath 資源 (打包成 JAR 後依然有效) —— 強烈推薦
ImageIcon icon = new ImageIcon(getClass().getResource("/images/logo.png"));
// 核心:設定視窗圖示
setIconImage(icon.getImage());
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(CustomIconSwing::new); // EDT 執行緒啟動
}
}
現代作業系統支援多尺寸圖示 (16x16, 32x32, 48x48, 64x64...)。單一圖片縮放會模糊,應提供多尺寸集合。
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.Arrays;
public class MultiResolutionIconDemo extends JFrame {
public MultiResolutionIconDemo() {
setTitle("多解析度圖示示範");
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 載入多尺寸圖片 (需預先準備 logo16.png, logo32.png, logo64.png...)
List icons = Arrays.asList(
new ImageIcon(getClass().getResource("/icons/logo16.png")).getImage(),
new ImageIcon(getClass().getResource("/icons/logo32.png")).getImage(),
new ImageIcon(getClass().getResource("/icons/logo48.png")).getImage(),
new ImageIcon(getClass().getResource("/icons/logo64.png")).getImage()
);
// Java 9+ 可用 MultiResolutionImage (此處手動設定列表)
setIconImages(icons); // 關鍵:setIconImages (複數) 接收 List
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(MultiResolutionIconDemo::new);
}
}
同樣使用 Toolkit 即可實現自訂游標:
Toolkit tk = Toolkit.getDefaultToolkit();
Image cursorImg = tk.getImage("cursor.png"); // 32x32 建議
Point hotspot = new Point(0, 0); // 熱點座標 (尖端位置)
Cursor customCursor = tk.createCustomCursor(cursorImg, hotspot, "CustomCursor");
setCursor(customCursor); // 元件級設定
| 場景 | 推薦寫法 | 說明 |
|---|---|---|
| 開發階段 (IDE 專案根目錄) | new ImageIcon("resources/logo.png") | 相對專案根目錄 |
| 打包 JAR / 生產環境 | new ImageIcon(getClass().getResource("/images/logo.png")) | 從 ClassPath 載入,/ 代表 classpath 根目錄 |
| 外部設定檔指定路徑 | new ImageIcon(new File(configPath).toURI().toURL()) | File -> URI -> URL |