四個 JCheckBox 分別控制「下巴、眼鏡、頭髮、牙齒」四個特徵,根據勾選組合動態拼湊圖片檔名(如 geek-cght.gif),即時顯示合成頭像。
public class CheckBoxDemo extends JPanel implements ItemListener {
JCheckBox chinButton, glassesButton, hairButton, teethButton;
StringBuffer choices = new StringBuffer("cght"); // 預設全選
JLabel pictureLabel;
public CheckBoxDemo() {
// 建立四個 CheckBox,設定助記鍵、預設勾選
chinButton = new JCheckBox("下巴(c)"); chinButton.setMnemonic(KeyEvent.VK_C); chinButton.setSelected(true);
// ... glassesButton(g), hairButton(h), teethButton(t) 同理
chinButton.addItemListener(this); // 統一監聽
pictureLabel = new JLabel();
updatePicture(); // 初始顯示
JPanel checkPanel = new JPanel(new GridLayout(0,1));
checkPanel.add(chinButton); checkPanel.add(glassesButton);
checkPanel.add(hairButton); checkPanel.add(teethButton);
add(checkPanel, BorderLayout.LINE_START);
add(pictureLabel, BorderLayout.CENTER);
}
public void itemStateChanged(ItemEvent e) {
int index = 0; char c = '-';
Object src = e.getItemSelectable();
if (src == chinButton) { index=0; c='c'; }
else if (src == glassesButton) { index=1; c='g'; }
else if (src == hairButton) { index=2; c='h'; }
else if (src == teethButton) { index=3; c='t'; }
if (e.getStateChange() == ItemEvent.DESELECTED) c = '-';
choices.setCharAt(index, c);
updatePicture();
}
protected void updatePicture() {
ImageIcon icon = createImageIcon("images/geek/geek-" + choices + ".gif");
pictureLabel.setIcon(icon);
pictureLabel.setToolTipText(choices.toString());
if (icon == null) pictureLabel.setText("沒有發現圖片");
else pictureLabel.setText(null);
}
// createImageIcon 載入資源...
}
StringBuffer 維護四字元狀態碼(c/g/h/t/-),對應四個特徵位置,O(1) 更新。ItemListener 統一處理四個核取方塊,透過 getItemSelectable() 識別來源。geek-XXXX.gif 直接映射狀態碼,無需複雜判斷邏輯。setMnemonic) 提升鍵盤操作體驗。