You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于AWT Java实现点击绘制图形更换颜色的功能咨询

AWT点击图形切换颜色的修改实现

无需额外自定义图形类,直接基于你现有代码做少量修改即可,核心思路是用JDK自带的Shape接口存储图形边界,绑定点击事件判断命中后更新颜色:

具体修改点

1. 新增依赖导入

在代码最开头添加几何类导入:

import java.awt.geom.*;

2. 改造Composants类

  • 新增两个集合分别存储所有绘制图形、每个图形对应的颜色
  • 构造方法中初始化所有图形、添加鼠标点击监听器
  • 改造paint方法遍历图形列表绘制

修改后完整代码

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;

public class TestGraphic {

    public static void main(String[] args) {
        new TestGraphic();
    }

    public TestGraphic() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Frame frame = new Frame();
                frame.add(new Composants());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
                
                frame.addWindowListener((WindowListener) new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent windowEvent){
                       System.exit(0);
                    }        
                 });
               
            }
        });   
    }
    
    public class Composants extends Container {

        private List<Shape> shapes = new ArrayList<>();
        private List<Color> shapeColors = new ArrayList<>();
        private List<Color> avaliableColors = new ArrayList<>(16);

        public Composants() {
            setLayout(new BorderLayout());
           
            avaliableColors.add(Color.BLACK);
            avaliableColors.add(Color.BLUE);
            avaliableColors.add(Color.CYAN);
            avaliableColors.add(Color.DARK_GRAY);
            avaliableColors.add(Color.GRAY);
            avaliableColors.add(Color.GREEN);
            avaliableColors.add(Color.LIGHT_GRAY);
            avaliableColors.add(Color.MAGENTA);
            avaliableColors.add(Color.ORANGE);
            avaliableColors.add(Color.PINK);
            avaliableColors.add(Color.RED);
            avaliableColors.add(Color.WHITE);
            avaliableColors.add(Color.YELLOW);

            // 初始化所有图形,和原paint方法里的坐标完全一致
            shapes.add(new Ellipse2D.Double(108, 110, 200, 200)); // 大圆
            shapes.add(new Ellipse2D.Double(160, 150, 20, 20)); // 左眼
            shapes.add(new Ellipse2D.Double(240, 150, 20, 20)); // 右眼
            shapes.add(new Rectangle2D.Double(160, 220, 100, 40)); // 嘴部矩形
            
            // 初始化所有图形默认颜色为黑色
            for (int i = 0; i < shapes.size(); i++) {
                shapeColors.add(Color.BLACK);
            }

            JButton btn = new JButton("全部换色");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Collections.shuffle(avaliableColors);
                    Color newColor = avaliableColors.get(0);
                    // 所有图形统一换色
                    for (int i = 0; i < shapeColors.size(); i++) {
                        shapeColors.set(i, newColor);
                    }
                    repaint();
                }
            });
            add(btn, BorderLayout.SOUTH);
            
            // 添加鼠标点击监听器,实现点击单个图形换色
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    // 倒序遍历,优先判断最上层的小图形
                    for (int i = shapes.size() - 1; i >= 0; i--) {
                        if (shapes.get(i).contains(e.getX(), e.getY())) {
                            Collections.shuffle(avaliableColors);
                            shapeColors.set(i, avaliableColors.get(0));
                            repaint();
                            break; // 只改最上层命中的第一个图形
                        }
                    }
                }
            });
            
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(600, 400);
        }
        public void close() {
            addComponentListener((ComponentListener) new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent windowEvent){
                   System.exit(0);
                }        
             });
        }

        @Override
        public void paint(Graphics gui) {
            super.paint(gui);
            Graphics2D g2d = (Graphics2D) gui.create();
            // 遍历所有图形逐个绘制
            for (int i = 0; i < shapes.size(); i++) {
                g2d.setColor(shapeColors.get(i));
                g2d.draw(shapes.get(i));
            }
            g2d.dispose();
        }
        
    }
}

功能说明

  • 点击任意绘制的图形(大圆、两个小圆眼睛、矩形嘴),该图形会自动随机切换颜色
  • 底部按钮保留原有逻辑,点击后所有图形统一切换为同一个随机颜色
  • 完全复用你原有代码的结构和图形坐标,无需额外自定义图形类

内容的提问来源于stack exchange,提问作者Marwane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:24:03