Swing 的 JCheckBox 不僅支援文字標籤,透過 Icon、RolloverIcon、SelectedIcon 三種圖標狀態,能輕鬆實現滑鼠懸停、選中時的視覺反饋。本文提供一個可直接運行的 Applet 範例,展示如何為每個複選框配置三態圖標並監聽選項變更事件。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class CheckBoxIconDemo extends JApplet implements ItemListener {
private JTextField statusField;
@Override
public void init() {
Container cp = getContentPane();
cp.setLayout(new FlowLayout());
// 預載三張圖標(請替換為實際路徑)
ImageIcon normal = new ImageIcon("images/6.gif");
ImageIcon rollover = new ImageIcon("images/7.gif");
ImageIcon selected = new ImageIcon("images/8.gif");
String[] labels = { "C", "C++", "Java" };
for (String label : labels) {
JCheckBox cb = new JCheckBox(label, normal);
cb.setRolloverIcon(rollover); // 滑鼠懸停
cb.setSelectedIcon(selected); // 選中狀態
cb.addItemListener(this);
cp.add(cb);
}
statusField = new JTextField(15);
statusField.setEditable(false);
cp.add(statusField);
}
@Override
public void itemStateChanged(ItemEvent e) {
JCheckBox src = (JCheckBox) e.getItem();
statusField.setText(src.getText() + (src.isSelected() ? " 已選中" : " 已取消"));
}
}
setIcon(構造函數傳入)對應正常態;setRolloverIcon 對應滑鼠進入;setSelectedIcon 對應選中態。若未設定,Swing 會自動生成灰化/按下效果。ItemListener,itemStateChanged 中通过 e.getStateChange() == ItemEvent.SELECTED 或 JCheckBox.isSelected() 判斷狀態。FlowLayout 自動左到右排列,適合表單類 UI。<applet code="CheckBoxIconDemo.class" width="400" height="200"></applet> 並用 appletviewer 運行。getClass().getResource("/icons/..."))而非絕對路徑。ImageIcon 緩存或 Icon 單例模式,避免重複載入。ActionMap/InputMap。