2013-03-09 73 views
3

我正在實施掃雷,我在處理鼠標事件時遇到了一些問題。我想要在mouseRelease(而不是mousePressed)上執行操作,因此用戶可以在按下鼠標按鈕後改變主意。有三種可能的動作:如何檢測兩個鼠標按鈕是否被同時釋放?

  1. LMB發佈 - 顯示當前場
  2. 人民幣發佈 - 把國旗在當前場
  3. 都LMB和人民幣發佈 - 亮點或透露相鄰領域

行動並不重要,我遇到的問題是如何觸發它們。

在案例1和2沒有其他按鈕下來 - 這是很容易檢查。

的問題是,在釋放方法mouseRelease兩次調用兩個按鈕的結果。如果兩個按鈕釋放之間的延遲太大,我寧願不觸發操作。換句話說,只有兩個按鈕在大約同一時間釋放時纔會觸發。

我可以方便地查看例如當按鈕1被釋放時按鈕3處於關閉狀態,但它並不真正有幫助。

目前,我有那麼沒有別的想法存儲時間第一按鈕被釋放時,然後比較對當另一個按鈕被釋放的時間 - 如果差值足夠小,觸發操作。

我真的不喜歡與System.currentTimeMillis的()或System.nanoTime(打一個想法),我不知道是否有這樣做的更好的辦法?

SOLUTION:

什麼已極度簡化的問題並沒有允許用戶鼠標指示器拖動到另一字段(並且因此改變了「選擇」字段)。釋放兩個按鈕之間的延遲並不重要。如果鼠標指針轉到另一個字段,則所有內容都被清除。以下是代碼片段:

private static final int B1DM = MouseEvent.BUTTON1_DOWN_MASK; 
private static final int B3DM = MouseEvent.BUTTON3_DOWN_MASK; 

private boolean bothWereDown = false; 

@Override 
public void mousePressed(MouseEvent e) { 

    // action if single button pressed 
    // in my case this is a sub-action of pressing both buttons 

    int both = B1DM | B3DM; 
    bothWereDown = (e.getModifiersEx() & both) == both; 

    if (bothWereDown) { 
     // action if both buttons pressed 
    } 
} 

@Override 
public void mouseDragged(MouseEvent e) { 

    // some other code 

    if (/* if pointer leaves field where mouse was pressed */) { 
     // some other code 
     bothWereDown = false; 
     // some other code 
    } 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    // some other code 

    if (e.getButton() == MouseEvent.BUTTON1) { 
     if (bothWereDown) { 
      if ((e.getModifiersEx() & B3DM) != B3DM) { 
       // action if both released 
      } 
     } else { 
      // action if left button released 
     } 
    } else if (e.getButton() == MouseEvent.BUTTON3) { 
     if (bothWereDown) { 
      if ((e.getModifiersEx() & B1DM) != B1DM) { 
       // action if both released 
      } 
     } else { 
      // action if right button released 
     } 
    } 

} 

回答

4

明顯的解決方案是跟蹤鼠標按鍵。我認爲,在這種情況下,沒有必要玩弄超時。

因此,按下兩個按鈕,然後釋放一個按鈕,將不會算作單個按鈕的釋放。事實上,就你而言,它可能什麼都不會做。只有當其他鼠標按鈕被釋放時,纔會被視爲釋放這兩個按鈕。

編輯:其實,你甚至不需要跟蹤鼠標按鍵,儘管你可能想要給出按鈕被按下的視覺指示,並且釋放它會產生效果。但是,當按鈕被釋放,並且您檢測到其他按鈕仍然被按下時,只需設置一個標誌,即釋放了兩個按鈕的一半,然後單鍵釋放一個按鈕即可完成。如果在單個按鈕釋放時沒有設置標誌,那麼它不是兩個按鈕動作的一部分,而是您執行單一按鈕釋放動作。

+0

這實際上可以忽略此超時是一個好主意。這種情況下的行爲並沒有很好的定義,甚至在系統掃雷中發生了一些奇怪的事情。我知道Swing沒有提供任何處理它的東西? – 2013-03-09 14:53:52

+0

@JaroslawPawlak在Swing中,我不知道任何與此相關的具體內容。我認爲Swing支持Doubleclick,但是同時按下多個按鈕的「和絃」,您必須處理好自己。但既然你只在發佈時觸發動作,它確實會更容易,不需要模糊的超時時間調整等。 – hyde 2013-03-09 15:11:13

+0

謝謝。我編輯了我的問題並添加了解決方案。 – 2013-03-09 15:46:11

相關問題