题目描述
编写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);}}}
运行结果:


发布评论