基于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
相关产品推荐
相关产品推荐

