JAVA中的MOUSE雙擊事件
MOUSE的雙擊事件,有時候是很有用的,如彈出處理對話框等,可是在JAVA中SUN公司沒有為我們准備這一特殊的事件,所以當我們在遇見的時候就不得不自己處理了。下面,筆都就將自己對這一過程的摸索詳細的道來,希望您能夠
遇見這樣的問題后不會頭痛。
如果是按鈕或者是文件框等的雙擊事件,就很好實現,只需要為其增加一個MouseLister事件,然后判斷它的單擊次數就可以確定是不是雙擊了:
public void MouseClick(e)
{
int clickTimes=e.getClickCount();
if(clickTimes==2)
{
System.out.println(“Doublc Clicked!”);
}
}
如果是表格就不一樣了,因為表格的默認是單擊遠中,雙擊進行編輯,當進入編輯狀態后,不管你怎么雙擊,都不會算做又擊,且單擊也不算,只認為你在編輯狀態。你可以測試,為表格增加監聽事件,然后把上面的代碼改為如下:
public void MouseClick(e)
{
int clickTimes=e.getClickCount();
//當你每次單擊的時候,第一條都會顯示
//可是在表格中當進入編輯狀態后不論你怎么雙擊單擊都不會出現該條提示
//說明單擊事件不認在這個時候
System.out.println(“Single Clicked!”);
if(clickTimes==2)
{
System.out.println(“Doublc Clicked!”);
}
}
當然就不會出現雙擊事件了。
另注: 如果是把表格的enable設為false那么也和按鈕一樣可以實現雙擊,可是有意義嗎!! 我不知道。
那我們現在該怎么辦呢?
您可能已經想到了,就是利用兩次的時間間隔來確定是不是雙擊了。可是你可得小心哦,也許你的利用時間間隔來確定的雙擊事件就不能夠實現哦。
此時,你也許就會把你的代碼改成下面這樣:

  long firstClick=0;
  long secondClick=0;
  boolean click=false;

  public void mouseClicked(MouseEvent e)
  {
    int clickCount = e.getClickCount();
    if(click==false)
    {
     firstClick=new Date().getTime();
     System.out.println("firstClick:"+firstClick);
     click=true;
     }
     else if(click==true)
     {
     secondClick=new Date().getTime();
     System.out.println("secondClick:"+secondClick);
     click=false;
     }
//這里的這個時間你可以自己改一下,不過,這個范圍也合適,你看看吧
     if (Math.abs((secondClick-firstClick)) < 200 && (secondClick-firstClick) > 30)
     {
 System.out.println("(secondClick-firstClick):"+(secondClick-firstClick));
     System.out.println("firstClick2:"+firstClick);
     System.out.println("secondClick2:"+secondClick);
     System.out.println("Double Clicked!");
     }   
  }
那你就在那里慢慢加上快快的點吧,可是總是也實現不了你要求的結果。為什么呢,不是雙擊,不是利用兩次時間間隔嗎,怎么會實現不了呢!!!!
忘了筆者上面說的嗎,就是雙擊進入后就不算了” 擊” 了。在這里,開始筆者也沒法,算了,不想了,出去上個走一下。
回來后,也許是頭清醒了一點,就把mousePressed方法寫成這樣
public void mousePressed(MouseEvent e)
{
System.out.println(“Pressed!”);
}
我運行一下程序,單擊表格,下面出現了Pressed! 這一行,這行正常,因為這既是單擊也是按了一下嗎,我雙擊,下面出來了一個好現象,出來了兩個Pressed! 。這使我一下就清醒了,原來雙擊,在這里同樣是說明按了兩次。
呵呵,我大笑三聲。
都知道怎么做了吧? 還不知道!!!!!
把下面MouseClicked中的內容,完全復制到Pressed事件中,一句都不要改:
public void mousePressed(MouseEvent e)
  {
    int clickCount = e.getClickCount();
    if(click==false)
    {
     firstClick=new Date().getTime();
     System.out.println("firstClick:"+firstClick);
     click=true;
     }
     else if(click==true)
     {
     secondClick=new Date().getTime();
     System.out.println("secondClick:"+secondClick);
     click=false;
     }
     if (Math.abs((secondClick-firstClick)) < 200 && (secondClick-firstClick) > 30)
     {
 System.out.println("(secondClick-firstClick):"+(secondClick-firstClick));
     System.out.println("firstClick2:"+firstClick);
     System.out.println("secondClick2:"+secondClick);
     System.out.println("Double Clicked!");
     }   
  }
看見想要的結果了嗎,還沒有!!!
好了
我把全部的程序放在下面(我做測試用的,有點亂,不過肯定能夠行)。
import java.awt.BorderLayout;import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTable;
import java.util.Date;
public class Test
  extends JFrame
{
  private BorderLayout borderLayout1 = new BorderLayout();
  JFrame frame = new JFrame();
  private JButton jButton1 = new JButton();
  String[] title =
  { "表頭一", "表頭二" };
  String[][] content =
  {
    { "1", "2" },
    { "3", "4" } };
  JTable table;
  long firstClick=0;
  long secondClick=0;
  boolean click=false;
  public Test()
  {
    try
    {
      table = new JTable(content, title);
      jbInit();
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }  public static void main(String[] args)
  {    new Test().setVisible(true);
  }  private void jbInit()
    throws Exception
  {
    this.getContentPane().setLayout(borderLayout1);
    this.setSize(new Dimension(441, 305));
    jButton1.setText("jButton1");    jButton1.addMouseListener(new MouseListener()
        {
          /**
           * 核心代碼
           */
          public void mouseClicked(MouseEvent e)
          {
            int clickCount = e.getClickCount();            
            if (clickCount == 2)
            {
              System.out.println("Double Clicked!");              
            }
          }
          public void mousePressed(MouseEvent e)
          {
          }
          public void mouseReleased(MouseEvent e)
          {
          }
          public void mouseEntered(MouseEvent e)
          {
          }
          public void mouseExited(MouseEvent e)
          {
          }
        });
    table.addMouseListener(new MouseListener()
        {
          /**
           * 核心代碼
           */
          public void mouseClicked(MouseEvent e)
          {
            int clickCount = e.getClickCount();
             if(click==false)
             {
               firstClick=new Date().getTime();
               System.out.println("firstClick:"+firstClick);
               click=true;
             }
             else if(click==true)
             {
               secondClick=new Date().getTime();
               System.out.println("secondClick:"+secondClick);
               click=false;
             }
             if (Math.abs((secondClick-firstClick)) < 200 && (secondClick-firstClick) > 30)
             { 
               System.out.println("(secondClick-firstClick):"+(secondClick-firstClick));
               System.out.println("firstClick2:"+firstClick);
               System.out.println("secondClick2:"+secondClick);
               System.out.println("Double Clicked!");
             }   
          }
          public void mousePressed(MouseEvent e)
          {
            if(click==false)
            {
              firstClick=new Date().getTime();
              System.out.println("firstClick:"+firstClick);
              click=true;
            }
            else if(click==true)
            {
              secondClick=new Date().getTime();
              System.out.println("secondClick:"+secondClick);
              click=false;
            }
            if (Math.abs((secondClick-firstClick)) < 200 && (secondClick-firstClick) > 30)
            { 
              System.out.println("(secondClick-firstClick):"+(secondClick-firstClick));
              System.out.println("firstClick2:"+firstClick);
              System.out.println("secondClick2:"+secondClick);
              System.out.println("Double Clicked!");
            }
          }          public void mouseReleased(MouseEvent e)
          {
          }          public void mouseEntered(MouseEvent e)
          {
          }          public void mouseExited(MouseEvent e)
          {
          }
        });
    this.getContentPane().add(jButton1, BorderLayout.NORTH);
    this.getContentPane().add(table, BorderLayout.SOUTH);  }}
記住,別忘了,好東西要和大伙分享哦!!~