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