我正在實施掃雷,我在處理鼠標事件時遇到了一些問題。我想要在mouseRelease(而不是mousePressed)上執行操作,因此用戶可以在按下鼠標按鈕後改變主意。有三種可能的動作:如何檢測兩個鼠標按鈕是否被同時釋放?
- LMB發佈 - 顯示當前場
- 人民幣發佈 - 把國旗在當前場
- 都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
}
}
}
這實際上可以忽略此超時是一個好主意。這種情況下的行爲並沒有很好的定義,甚至在系統掃雷中發生了一些奇怪的事情。我知道Swing沒有提供任何處理它的東西? – 2013-03-09 14:53:52
@JaroslawPawlak在Swing中,我不知道任何與此相關的具體內容。我認爲Swing支持Doubleclick,但是同時按下多個按鈕的「和絃」,您必須處理好自己。但既然你只在發佈時觸發動作,它確實會更容易,不需要模糊的超時時間調整等。 – hyde 2013-03-09 15:11:13
謝謝。我編輯了我的問題並添加了解決方案。 – 2013-03-09 15:46:11