首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Swing 組件實戰:JCheckBox 組合圖片動態切換

     編輯:Java 程式設計入門

效果預覽

四個複選框分別控制「下巴、眼鏡、頭發、牙齒」四個特徵的顯示/隱藏,通過組合生成 16 種不同的卡通臉部圖片(文件名規則:geek-XXXX.gif,X 為 c/g/h/t 或 -)。

核心設計:狀態位掩碼 + 文件名模板

  • 用 StringBuffer 維護 4 字符狀態串,初始 "cght"
  • 每個複選框對應固定索引:0=c, 1=g, 2=h, 3=t
  • 選中 → 寫入對應字母;取消 → 寫入 '-'
  • 拼接文件名 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);
        });
    }
}

關鍵技術點

  • ItemListener vs ActionListener:複選框狀態變更用 ItemEvent,可區分 SELECTED/DESELECTED
  • 資源加載:Class.getResource() 支持 JAR 內部圖片,部署無憂
  • Mnemonics:setMnemonic() 支持 Alt+鍵快捷操作,提升無障礙性
  • 線程安全:Swing 操作置於 EDT(SwingUtilities.invokeLater)

擴展思路

可將「特徵-索引-字母」映射提取為配置,實現任意組合圖片生成器;結合 JSlider 實現特徵漸變動畫;接入 AI 生成圖片替換靜態資源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved