所有繼承 AbstractButton 的元件(JButton、JCheckBox、JRadioButton、JMenuItem 等)及 JLabel 均支援 Icon 介面。ImageIcon 是最常用實現,直接載入 GIF/PNG/JPG 檔案。
public class Faces extends JPanel {
static Icon[] faces = {
new ImageIcon("face0.gif"), new ImageIcon("face1.gif"),
new ImageIcon("face2.gif"), new ImageIcon("face3.gif"),
new ImageIcon("face4.gif")
};
JButton btn = new JButton("JButton", faces[3]); // 初始圖示
JButton toggleBtn = new JButton("Disable");
boolean mad = false;
public Faces() {
// 點擊切換圖示
btn.addActionListener(e -> {
btn.setIcon(mad ? faces[3] : faces[0]);
mad = !mad;
btn.setVerticalAlignment(JButton.TOP);
btn.setHorizontalAlignment(JButton.LEFT);
});
// 狀態專用圖示
btn.setRolloverEnabled(true); // 啟用滑鼠懸停
btn.setRolloverIcon(faces[1]); // 懸停圖示
btn.setPressedIcon(faces[2]); // 按下圖示
btn.setDisabledIcon(faces[4]); // 禁用圖示
btn.setToolTipText("Yow!"); // 工具提示
add(btn);
// 禁用/啟用切換
toggleBtn.addActionListener(e -> {
btn.setEnabled(!btn.isEnabled());
toggleBtn.setText(btn.isEnabled() ? "Disable" : "Enable");
});
add(toggleBtn);
}
// main()...
}
| 方法 | 觸發時機 | 視覺回饋 |
|---|---|---|
setIcon() | 預設狀態 | 基礎外觀 |
setRolloverIcon() | 滑鼠進入區域 (需 setRolloverEnabled(true)) | 懸停預覽 |
setPressedIcon() | 滑鼠按下未釋放 | 按下效果 |
setDisabledIcon() | setEnabled(false) | 灰化/禁用狀態 |
setSelectedIcon() | 選中狀態 (JToggleButton 等) | 選中標記 |
btn.setVerticalAlignment(JButton.TOP); // 垂直靠上
btn.setHorizontalAlignment(JButton.LEFT); // 水平靠左
btn.setIconTextGap(8); // 圖文間距
setToolTipText("儲存檔案 (Ctrl+S)")。setToolTipText("刪除
永久移除項目")。ToolTipManager.sharedInstance().setInitialDelay(500)。getClass().getResource("/icons/save.png") 載入,打包 JAR 後仍可訪問。static final Icon SAVE_ICON = new ImageIcon(...) 避免重複載入。Swing 圖示系統透過**狀態專用圖示**機制,以極簡 API 賦予按鈕豐富的視覺回饋。善用 Rollover/Pressed/Disabled 圖示搭配工具提示,能大幅提升介面專業度與易用性。記住:圖示資源請納入 classpath 管理,確保部署一致性。