四個複選框分別控制「下巴、眼鏡、頭發、牙齒」四個特徵的顯示/隱藏,通過組合生成 16 種不同的卡通臉部圖片(文件名規則:geek-XXXX.gif,X 為 c/g/h/t 或 -)。
StringBuffer 維護 4 字符狀態串,初始 "cght"'-'images/geek/geek-{state}.gif 載入圖標import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CheckBoxDemo extends JPanel implements ItemListener {
private JCheckBox chinBox, glassesBox, hairBox, teethBox;
private StringBuffer choices = new StringBuffer("cght");
private JLabel pictureLabel;
public CheckBoxDemo() {
super(new BorderLayout());
// 創建四個複選框,默認全選
chinBox = createCheckBox("下巴(c)", KeyEvent.VK_C);
glassesBox = createCheckBox("眼鏡(g)", KeyEvent.VK_G);
hairBox = createCheckBox("頭發(h)", KeyEvent.VK_H);
teethBox = createCheckBox("牙齒(t)", KeyEvent.VK_T);
// 註冊監聽
for (JCheckBox cb : new JCheckBox[]{chinBox, glassesBox, hairBox, teethBox}) {
cb.addItemListener(this);
}
// 圖片標簽
pictureLabel = new JLabel();
pictureLabel.setFont(pictureLabel.getFont().deriveFont(Font.ITALIC));
updatePicture();
// 左側複選框面板
JPanel checkPanel = new JPanel(new GridLayout(0, 1));
checkPanel.add(chinBox);
checkPanel.add(glassesBox);
checkPanel.add(hairBox);
checkPanel.add(teethBox);
add(checkPanel, BorderLayout.LINE_START);
add(pictureLabel, BorderLayout.CENTER);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
}
private JCheckBox createCheckBox(String text, int mnemonic) {
JCheckBox cb = new JCheckBox(text);
cb.setMnemonic(mnemonic);
cb.setSelected(true);
return cb;
}
@Override
public void itemStateChanged(ItemEvent e) {
int index = -1;
char replacement = '-';
Object src = e.getItemSelectable();
if (src == chinBox) { index = 0; replacement = 'c'; }
else if (src == glassesBox) { index = 1; replacement = 'g'; }
else if (src == hairBox) { index = 2; replacement = 'h'; }
else if (src == teethBox) { index = 3; replacement = 't'; }
if (e.getStateChange() == ItemEvent.DESELECTED) {
replacement = '-';
}
choices.setCharAt(index, replacement);
updatePicture();
}
private void updatePicture() {
String path = "images/geek/geek-" + choices + ".gif";
ImageIcon icon = createImageIcon(path);
pictureLabel.setIcon(icon);
pictureLabel.setToolTipText(choices.toString());
pictureLabel.setText(icon == null ? "圖片未找到" : null);
}
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = CheckBoxDemo.class.getResource(path);
return (imgURL != null) ? new ImageIcon(imgURL) : null;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("CheckBoxDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new CheckBoxDemo());
frame.pack();
frame.setVisible(true);
});
}
}
ItemEvent,可區分 SELECTED/DESELECTEDClass.getResource() 支持 JAR 內部圖片,部署無憂setMnemonic() 支持 Alt+鍵快捷操作,提升無障礙性SwingUtilities.invokeLater)可將「特徵-索引-字母」映射提取為配置,實現任意組合圖片生成器;結合 JSlider 實現特徵漸變動畫;接入 AI 生成圖片替換靜態資源。