2011-07-12 68 views
3

使用EventHandler,我注意到有時它認爲我在拖動鼠標,即使我只是點擊它。如何提高EventHandler對MouseDragged和MouseClicked事件的敏感度

下面是一個簡單的例子

EventHandler[Graphics[Circle[{0, 0}, 1]], 
"MouseClicked" :> Print["mouse clicked"], 
"MouseDragged" :> Print["mouse being dragged"] 
] 

當我開始點擊,即使我要確保鼠標完全固定,不動了,我只是不停地點擊,並查看打印的消息,一旦一會兒我看到拖動的信息出來了。我知道這可以是敏感的鼠標(但我有一個很好的鼠標),甚至可能是鼠標墊,操作系統,任何輕微的手動,可能會導致這種情況。

我想問一下,如果有人可以試試這個,看看你是否也注意到了這個問題,並且如果有人知道我可以在Mathematica中做一些設置來最小化這個問題。我正在尋找EventHandler的選項來設置時間或延遲,以確定鼠標何時被拖動,但什麼也看不到。

這裏是什麼,我得到我的系統上,當我運行上面的代碼

mouse being dragged 
mouse clicked 
mouse clicked  
mouse clicked  
mouse clicked  
mouse clicked  
mouse clicked  
mouse clicked 
mouse clicked  
mouse being dragged  
mouse clicked 
mouse clicked 

這是Windows 7後,我只需點擊輸出例如,數學8.0.1

感謝

+0

我沒有任何問題與此同時。我只是「點擊鼠標」。 (Ubuntu 11.04,Mma 8.0.1和7.0.1) – Simon

+0

感謝您的嘗試。但是用我目前的程序,在我的系統(Windows 7)上,我可以很清楚地看到MouseDragged事件正在竊取MouseClicked事件。我可以點擊幾下鼠標,他們都會轉而使用MouseDragged事件。這使得MouseDragged無用,直接使用。所以我改變了它,當ControlKey被按下時,拖動它,現在不再與MouseClicked事件發生衝突。但是我發現在按住ControlKey的同時在屏幕上拖動一個點比沒有它慢很多。 – Nasser

回答

3

以下是不完美的,但似乎更好的工作:

initMousePos = {-1, -1}; 
dragged = False; 
EventHandler[ 
[email protected][Circle[{0, 0}, 1]], 
"MouseDown" :> 
    (initMousePos = MousePosition["Graphics"]), 
"MouseUp" :> 
    If[EuclideanDistance[MousePosition["Graphics"], initMousePos] < 2 10^-1, 
    Print["MouseClicked " <> [email protected]["Graphics"]], 
    Sequence @@ {}], 
"MouseDragged" :> 
    If[EuclideanDistance[MousePosition["Graphics"], initMousePos] > 2 10^-1, 
    Print["mouse being dragged " <> 
    [email protected]["Graphics"]], Sequence @@ {}]] 
+0

謝謝,那是更聰明的做法。這種檢查鼠標向下和鼠標移動位置之間距離的技巧似乎比檢查「MouseClicked」事件更可靠!我將在我現在正在進行的演示中嘗試您的方法。我希望它能改善事情。 – Nasser

+0

順便說一句,我不知道你爲什麼在上面的IF語句的ELSE部分添加了Sequenc @@ {}?我刪除了它們,它和以前一樣工作。我認爲有一個很好的理由,但我現在沒有看到它。 – Nasser

+1

@Nasser問題是,如果鼠標在點擊時移動,'MouseDragged'被觸發得太快。我首先試圖插入一個遲滯週期,但它變得太複雜了。我確信上面的代碼可以改進很多,但這只是一個開始。關於'Sequence []'的東西,我把它放在那裏,以防你想用一個強制的返回值作爲一個函數調用整個事物。如果您覺得那部分沒用,請將其取出。 –