600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > java鼠标事件 单击左键画圆 右键画矩形 双击左键清除

java鼠标事件 单击左键画圆 右键画矩形 双击左键清除

时间:2020-07-29 16:15:32

相关推荐

java鼠标事件 单击左键画圆 右键画矩形 双击左键清除

java鼠标点击事件举例

题目描述一、基本思路二、引用的类分析三、代码实现

题目描述

编写Java程序,创建一个窗体,并实现交互。在窗体内“单击鼠标左键”,在光标处绘制一个“绿圆”;窗体内“单击鼠标右键”,在光标处绘制一个“红色方框”;窗体内“双击鼠标左键”,清空所有已画“圆”和“方”。

一、基本思路

题目属于简单的窗体交互,主体代码是给面板添加鼠标事件监听器,然后实现该监听器。

二、引用的类分析

1,这里要实现在窗口作画,需要引入Graphics类。

2,实现鼠标双击事件,可以通过事件源e.getClickCount()==2来判断鼠标点击次数来实现鼠标双击事件。但这样的话,程序在执行双击事件前会再执行一次左键单击事件。为了避免这种情况,这里使用java中的定时器类Timer。

Timer的方法schedule(TimerTask task, Date firstTime , long period)这个方法是调度一个task,从事件firstTime开始调度,每次调度完后,要等待period(ms)才开始继续调度。

(实现的代码中对Timer类的使用借鉴于多位博主的文章内容)

三、代码实现

import java.awt.event.*;import javax.swing.JFrame;import javax.swing.JPanel;import java.awt.Graphics;import java.awt.Color;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class MyFrame extends JFrame {MyPanel panel;MyFrame() {panel = new MyPanel();this.setBounds(500, 500, 600, 600);panel.addMouseListener(new Draw()); // 为面板添加鼠标监听器this.add(panel);this.setVisible(true);}public static void main(String[] args) {MyFrame mf = new MyFrame();}}class MyPanel extends JPanel {int judge = 0; // 判断鼠标点击状态int x;int y;@Overridepublic void paint(Graphics g) {if (judge == 1) // 单击左键{g.setColor(Color.GREEN);g.fillOval(x, y, 50, 50);} else if (judge == 2) // 双击左键{g.setColor(Color.WHITE);super.paint(g);} else if (judge == 3) // 单击右键{g.setColor(Color.RED);g.fillRect(x, y, 50, 50);}}}class Draw extends MouseAdapter {static boolean f = false;static int n = 1;@Overridepublic void mouseClicked(MouseEvent e) {// 实现监听器final MyPanel mp = (MyPanel) e.getSource();mp.x = e.getX(); // 获取鼠标点击的位置,为画图确定坐标mp.y = e.getY();f = false;if (e.getButton() == e.BUTTON3) {// 单击右键n = 3;mp.judge = n;mp.repaint();n = 1;return;}else if (e.getButton() == e.BUTTON1) {if (n == 2) {// 双击左键mp.judge = n;mp.repaint();n = 1;f = true;return;}Timer timer = new Timer(); // 使用定时器来判断双击和单击左键timer.schedule(new TimerTask() {int num = 0;@Overridepublic void run() {if (f) {// 判断双击事件是否已经执行,若已执行则取消定时器任务num = 0;n = 1;this.cancel();return;}if (num == 1) {mp.judge = num; // 定时器再次执行,调用左键单击事件,然后取消定时器任务mp.repaint();f = true;n = 1;num = 0;this.cancel();return;}n++;num++;}}, new Date(), 150);}}}

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。