鼠標的單雙擊事件在很多時候對我們幫助很大,但是在JAVA中卻沒有給出鼠標雙擊事件.我們可以通過事件源e.getClickCount()==2來判斷鼠標點擊次數來實現鼠標雙擊事件,例如:
public class MyMouseListener
extends java.awt.event.MouseAdapter {
public void mouseClicked(MouseEvent e) {
System.out.println("clicked");
int clickTimes = e.getClickCount();
if (clickTimes == 2) {
System.out.println("Doublc Clicked!");
}
}
}
extends java.awt.event.MouseAdapter {
public void mouseClicked(MouseEvent e) {
System.out.println("clicked");
int clickTimes = e.getClickCount();
if (clickTimes == 2) {
System.out.println("Doublc Clicked!");
}
}
}
但是這樣並沒有達到我們的要求,因爲在每次觸發雙擊事件的同時會觸發單擊事件.所以我們試圖改進以上方案,不使用系統提供的e.getClickCount()方法.可以考慮當第一次單擊鼠標的時候讓鼠標單擊事件延時0.2秒執行,而在這段時間裏等待第二次單擊,如果有第二次單擊,那麼我們執行雙擊事件任務,取消單擊任務;如果在這段時間沒有等到再次單擊,那麼執行單擊任務.
下面是用定時器延時單擊事件實現鼠標雙擊事件,單擊和雙擊事件互不影響!
public class MyMouseListener
extends java.awt.event.MouseAdapter {
private static boolean flag=false;//用來判斷是否已經執行雙擊事件
private static int clickNum=0;//用來判斷是否該執行雙擊事件
public void mouseClicked(MouseEvent e) {
final MouseEvent me=e;//事件源
this.flag=false;//每次點擊鼠標初始化雙擊事件執行標誌爲false
if (this.clickNum == 1) {//當clickNum==1時執行雙擊事件
this.mouseDoubleClicked(me);//執行雙擊事件
this.clickNum=0;//初始化雙擊事件執行標誌爲0
this.flag=true;//雙擊事件已執行,事件標誌爲true
return;
}
//定義定時器
java.util.Timer timer=new java.util.Timer();
//定時器開始執行,延時0.2秒後確定是否執行單擊事件
timer.schedule(new java.util.TimerTask() {
private int n=0;//記錄定時器執行次數
public void run() {
if(MyMouseListener.flag){//如果雙擊事件已經執行,那麼直接取消單擊執行
n=0;
MyMouseListener.clickNum=0;
this.cancel();
return;
}
if (n == 1) {//定時器等待0.2秒後,雙擊事件仍未發生,執行單擊事件
mouseSingleClicked(me);//執行單擊事件
MyMouseListener.flag = true;
MyMouseListener.clickNum=0;
n=0;
this.cancel();
return;
}
clickNum++;
n++;
}
},new java.util.Date(),200);
}
/**
* 鼠標單擊事件
* @param e 事件源參數
*/
public void mouseSingleClicked(MouseEvent e){
System.out.println("Single Clicked!");
}
/**
* 鼠標雙擊事件
* @param e 事件源參數
*/
public void mouseDoubleClicked(MouseEvent e){
System.out.println("Doublc Clicked!");
}
}
extends java.awt.event.MouseAdapter {
private static boolean flag=false;//用來判斷是否已經執行雙擊事件
private static int clickNum=0;//用來判斷是否該執行雙擊事件
public void mouseClicked(MouseEvent e) {
final MouseEvent me=e;//事件源
this.flag=false;//每次點擊鼠標初始化雙擊事件執行標誌爲false
if (this.clickNum == 1) {//當clickNum==1時執行雙擊事件
this.mouseDoubleClicked(me);//執行雙擊事件
this.clickNum=0;//初始化雙擊事件執行標誌爲0
this.flag=true;//雙擊事件已執行,事件標誌爲true
return;
}
//定義定時器
java.util.Timer timer=new java.util.Timer();
//定時器開始執行,延時0.2秒後確定是否執行單擊事件
timer.schedule(new java.util.TimerTask() {
private int n=0;//記錄定時器執行次數
public void run() {
if(MyMouseListener.flag){//如果雙擊事件已經執行,那麼直接取消單擊執行
n=0;
MyMouseListener.clickNum=0;
this.cancel();
return;
}
if (n == 1) {//定時器等待0.2秒後,雙擊事件仍未發生,執行單擊事件
mouseSingleClicked(me);//執行單擊事件
MyMouseListener.flag = true;
MyMouseListener.clickNum=0;
n=0;
this.cancel();
return;
}
clickNum++;
n++;
}
},new java.util.Date(),200);
}
/**
* 鼠標單擊事件
* @param e 事件源參數
*/
public void mouseSingleClicked(MouseEvent e){
System.out.println("Single Clicked!");
}
/**
* 鼠標雙擊事件
* @param e 事件源參數
*/
public void mouseDoubleClicked(MouseEvent e){
System.out.println("Doublc Clicked!");
}
}