上一节我们给我们的项目添加了键盘侦听事件,这一节我们来添加鼠标响应事件。
我们新建一个类AlgoMouseListener来继承MouseAdapter来处理鼠标相关的事件,这背后的机制和我们上一节中的KeyAdapter是完全一样的。
我们稍微看一下,相对比键盘事件复杂一点。
下面来实现我们的方法。
具体绘制
完整代码
import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class AlgoVisualizer { private Circle[] circles; private AlgoFrame frame; private boolean isAnimated = true; public AlgoVisualizer(int sceneWidth, int sceneHeight, int N){ // 初始化数据 circles = new Circle[N]; int R = 50; for(int i = 0 ; i < N ; i ++){ int x = (int)(Math.random()*(sceneWidth-2*R)) + R; int y = (int)(Math.random()*(sceneHeight-2*R)) + R; int vx = (int)(Math.random()*11) - 5; int vy = (int)(Math.random()*11) - 5; circles[i] = new Circle(x, y, R, vx, vy); } // 初始化视图 EventQueue.invokeLater(() -> { frame = new AlgoFrame("Welcome to new World", sceneWidth, sceneHeight); frame.addKeyListener(new AlgoKeyListener()); frame.addMouseListener(new AlgoMouseListener()); new Thread(() -> { run(); }).start(); }); } // 动画逻辑 private void run(){ while(true){ // 绘制数据 frame.render(circles); AlgoVisHelper.pause(20); // 更新数据 if(isAnimated) for(Circle circle : circles) circle.move(0, 0, frame.getCanvasWidth(), frame.getCanvasHeight()); } } private class AlgoKeyListener extends KeyAdapter{ @Override public void keyReleased(KeyEvent event){ if(event.getKeyChar() == ' ') isAnimated = !isAnimated; } } private class AlgoMouseListener extends MouseAdapter{ @Override public void mousePressed(MouseEvent event){//event存储鼠标点击信息 //System.out.println(event.getPoint());打印信息,点击输出画布坐标 event.translatePoint(0, -(frame.getBounds().height - frame.getCanvasHeight())); for(Circle circle : circles) if(circle.contain(event.getPoint()))//点击位置判断是否在Circle中 circle.isFilled = !circle.isFilled;//若在,就填充。 } } public static void main(String[] args) { int sceneWidth = 800; int sceneHeight = 800; int N = 10; AlgoVisualizer visualizer = new AlgoVisualizer(sceneWidth, sceneHeight, N); } }