题目描述

编写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;publicclassMyFrameextendsJFrame{
	MyPanel panel;MyFrame(){
		panel =newMyPanel();this.setBounds(500,500,600,600);
		panel.addMouseListener(newDraw());// 为面板添加鼠标监听器this.add(panel);this.setVisible(true);}publicstaticvoidmain(String[] args){
		MyFrame mf =newMyFrame();}}classMyPanelextendsJPanel{int judge =0;// 判断鼠标点击状态int x;int y;@Overridepublicvoidpaint(Graphics g){if(judge ==1)// 单击左键{
			g.setColor(Color.GREEN);
			g.fillOval(x, y,50,50);}elseif(judge ==2)// 双击左键{
			g.setColor(Color.WHITE);super.paint(g);}elseif(judge ==3)// 单击右键{
			g.setColor(Color.RED);
			g.fillRect(x, y,50,50);}}}classDrawextendsMouseAdapter{staticboolean f =false;staticint n =1;@OverridepublicvoidmouseClicked(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;}elseif(e.getButton()== e.BUTTON1){if(n ==2){// 双击左键
				mp.judge = n;
				mp.repaint();
				n =1;
				f =true;return;}
			Timer timer =newTimer();// 使用定时器来判断双击和单击左键
			timer.schedule(newTimerTask(){int num =0;@Overridepublicvoidrun(){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++;}},newDate(),150);}}}

运行结果: