2009-02-14 142 views
15

任何人都可以想出一種很好的方法來忽略Java中雙擊出現的單擊操作嗎?Java:忽略單擊雙擊?

我期待有不同的行爲,爲每個這樣的:

  • 單點擊畫上的點擊點
  • 雙擊選擇屏幕上的對象十字線,但應該點擊點上漆十字線

......任何人都可以想出一種方法來做到這一點?某種定時器設置可能?一個想法表示讚賞:-)

<免責聲明> ...是的,我知道我犯了一個非常可憎的可用性/用戶界面失算。 < /免責聲明>

編輯#2:

即使這部作品由於計時器延遲是鬱悶 - 我放棄了這個方案,並使用選擇的,而不是雙擊中鍵點擊...

編輯:

感謝cgull - 這是我能拿出給您的確認,有沒有簡單的方法來做到這一點(注意,如果我設置定時器< 200多賽車被認爲是點擊&計時器之間,但只要我設置爲一個值> 200分工作的事情只是桃色):

public void mouseClicked(MouseEvent e) { 
    System.out.println("Click at (" + e.getX() + ":" + e.getY() + ")"); 
    if (e.getClickCount() == 2) { 
     System.out.println(" and it's a double click!"); 
     wasDoubleClick = true; 
    }else{ 
     Integer timerinterval = (Integer) 
      Toolkit.getDefaultToolkit().getDesktopProperty(
         "awt.multiClickInterval"); 
     timer = new Timer(timerinterval.intValue(), new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       if (wasDoubleClick) { 
        wasDoubleClick = false; // reset flag 
       } else { 
        System.out.println(" and it's a simple click!"); 
       } 
      }  
     }); 
     timer.setRepeats(false); 
     timer.start(); 
    } 
} 
+0

這可怎麼工作的? wasDoubleClick不能是最終的,它在另一個類中使用(匿名ActionListener一個) – alessiop86 2012-09-15 10:20:14

回答

16

的確,您需要在您的MouseAdapter的重寫的mouseClicked()方法中設置一個Timer,以檢測兩次點擊之間的時間間隔。以毫秒爲單位的默認時間間隔可通過查詢 Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval")找到。如果在計時器到期之前檢測到另一次鼠標點擊,則您有雙擊,否則一旦計時器到期,您可以處理單擊。

0

你試過已經實現的MouseListener接口?

我認爲MouseEvent有一個點擊計數方法(或屬性)來知道這一點。

我敢打賭,你已經經歷過那個,那麼你面臨的問題是什麼?

也許你可以做的是編寫一個線程或一些東西之間的單次和雙擊之間的時間間隔。

因此,如果在300毫秒內沒有發出另一次點擊,則單擊只會有效。 (什麼配置)

的理念是:

public void listen for the single click() 
    if ( in x time there has not been another click ) 
    then 
     we have a single click 
     proceed with your single click handling 
    else 
     we have a double click 
     proceed with your double click handling 

或者類似的東西。

0

另一種解決方案:

我想通了,在此之前,我發現這個問題的解決方案。這個想法是一樣的,使用一個計時器,雖然更復雜:)。

使用SwingWorker

class BackgroundClickHandler extends SwingWorker<Integer, Integer> { 
    @Override 
    protected Integer doInBackground() throws Exception { 
    Thread.sleep(200); 
    // Do what you want with single click 
    return 0; 
    } 

} 

mouseClicked()方法,你可以做這樣的事情:

if (event.getClickCount() == 1) { 
    // We create a new instance everytime since 
    // the execute() method is designed to be executed once 
    clickHandler = new BackgroundClickHandler(); 

    try { 
    clickHandler.execute(); 
    } catch(Exception e) { 
    writer.println("Here!"); 
    } 
} 

if (event.getClickCount() == 2) { 
    clickHandler.cancel(true); 

    //Do what you want with double click 
} 

我希望它是有用的。

2

其實我覺得這是一個簡單的解決方案(使用InputEvent的的getWhen()方法):

class DCListener extends MouseAdapter{ 

    private long maxTimeBetweenClicks; // in millis 
    private long firstClickTime=0; 
    private Runnable eventHandler; 

    public DCListener(long maxTimeBetweenClicks,Runnable eventHandler){ 
     this.maxTimeBetweenClicks=maxTimeBetweenClicks; 
     this.eventHandler=eventHandler; 
    } 

    public void mouseClicked(MouseEvent e){ 

     if((e.getWhen()-firstClickTime)<=maxTimeBetweenClicks){ 
      firstClickTime=0; // 3 clicks are not 2 double clicks 
      eventHandler.run(); 
     }else{ 
      firstClickTime=e.getWhen(); 
     } 

    } 
}