2011-07-22 74 views
1

如果用戶在JList組件上按下超過3秒,是否有任何方法捕獲事件?Java檢測長按鼠標

我發現的困難部分是事件需要在用戶放開鼠標左鍵之前觸發。 (可以通過mousePressed和mouseReleased輕鬆完成)

+0

所有答案(截至2016年)都含有微妙的錯誤,絕不應該原樣使用。 –

回答

1

我有一個想法。它不完全是一個聽衆,但你可以做的是在mousePressed你可以做一個定時器開始。當計時器達到3秒時,您的活動開始,或者如果他們放開,在mouseReleased計時器停止。

3

繼承人什麼我使用對於類似的情況:

public class Player implements Runnable, MouseListener 
{ 
    public void mousePressed(MouseEvent e) 
    { 
     holding = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
     holding = false; 
     System.out.println("Held for: "+seconds); 
    } 
    public void mouseClicked(MouseEvent e){} 

    public void run() 
    { 
     try 
     { 
      while(holding) 
      { 
       seconds++; 
       // put some code here 
       if(seconds==3) 
       { 
        holding = false; 
        System.out.println("Held for maximum time!"); 
       } 
      } 
     }catch(Exception e){e.printStackTrace();} 

    private boolean holding; 
    private int seconds; 
    private Thread thread; 
} 

通過調用label.addMouseListener添加到您的JLabel(新播放器());

+1

所以現在你有一個控制變量可以在多個線程上訪問,如果你想在UI中做任何事情(這可能是因爲用戶做了一些代碼應該反應的東西),你需要從該線程回到UI線。與簡單的Swing'Timer'相比,所有這些優點有什麼好處? – Robin

4

您可以在您的mouseDown事件偵聽器中設置一個計時器,並在初始延遲3000毫秒後每500毫秒執行一次。在你的鼠標釋放你可以取消該計時器。在與Timer關聯的TimerTask對象的運行方法上,您可以執行所需任務的計算。這裏是我的解決方案:

import javax.swing.*; 
import java.awt.event.*; 
import java.util.*; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     final JFrame f = new JFrame(); 
     String[] data = {"one", "two", "three", "four"}; 
     JList myList = new JList(data); 
     f.add(myList); 
     myList.addMouseListener(
      new MouseAdapter() 
      { 
       private java.util.Timer t; 
       public void mousePressed(MouseEvent e) 
       { 
        if(t == null) 
        { 
         t = new java.util.Timer(); 
        } 
        t.schedule(new TimerTask() 
        { 
         public void run() 
         { 
          System.out.println("My importan task goes here"); 
         } 
        },3000,500); 
       } 

       public void mouseReleased(MouseEvent e) 
       { 
        if(t != null) 
        { 
         t.cancel(); 
         t = null; 
        } 
       } 
      } 
      ); 
      f.pack(); 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        f.setVisible(true); 
       } 
      } 
     ); 
    } 
} 
+0

您的代碼有效!只是好奇...爲什麼我們需要把f.setvisible(true);在SwingUtilities.invokeLater()中? – Reusable

+0

這很好,另外一個好的補充是,第一次點擊應該執行任務,然後在3秒後用戶仍然是鼠標按下,然後每500ms啓動一次計劃任務 –

3

兩種不同的解決方案(幾乎相同,以前的):

new MouseAdapter() { 
     Date pressedTime; 
     long timeClicked; 

     @Override 
     public void mousePressed(MouseEvent e) { 
      pressedTime = new Date(); 
     } 
     @Override 
     public void mouseReleased(MouseEvent e) { 
      timeClicked = new Date().getTime() - pressedTime.getTime(); 
      if (timeClicked >= 3000) { 
       // DO YOUR ACTION HERE 
      } 
     } 
    }; 

new MouseAdapter() { 
    boolean mousePressed = false; 

    @Override 
    public void mousePressed(MouseEvent e) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       mousePressed = true; 
       while (mousePressed) { 
        try { 
         Thread.sleep(3000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        if (mousePressed) { 
         // DO YOUR ACTION HERE 
        } 
       } 
      } 
     }).start(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     mousePressed = false; 
    } 
} 
0

有了這個代碼,你可以檢測和管理壓長或短(如點擊),一個事件排除另一個事件。

private int pressStatus = 0; // TO DETECT IF LONG IS REAL LONG OR SHORT PRESSED 
private Timer t; 

... 

@Override 
public void mousePressed(final MouseEvent arg0) { 
    pressStatus = 0; // to manage simple click or long 

    if (t == null) { 
     t = new Timer(); 
    } 
    t.schedule(new TimerTask() { 
     public void run() { 
      pressStatus = 1; 

      if (t != null) { 
       t.cancel(); 
       t = null; 
      } 

      // PRESSED LONG 
      int modifiers = arg0.getModifiers(); 
      if ((modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) { 
       ... 
      } else if ((modifiers & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) { 
       .... 
      } 
     } 
    }, 700, 1); 
} 

@Override 
public void mouseReleased(MouseEvent arg0) { 
    if (t != null) { 
     t.cancel(); 
     t = null; 
    } 

    // PRESSED SHORT LIKE CLICK 
    if (pressStatus == 0) { 
     int modifiers = arg0.getModifiers(); 
     if ((modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK) { 
      ... 
     } else if ((modifiers & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) { 
      ... 
     } 
    } 

    pressStatus = 0; 
}