2011-07-12 4 views
3

へのEventHandlerのsensietivityを改善するために、どのように、私は時々、それは私が、私はちょうどそれをクリックしたにもかかわらず、マウスをドラッグして考えていることに気づきます。私は一度では、私はマウスが完全に固定して動いていないことを確認して、私はちょうどクリックし続けるにもかかわらず、クリックして、印刷メッセージを見て起動すると、ここでは、イベントハンドラを使用してMouseDraggedとのmouseClickedイベント

は簡単な例

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

です私はドラッグメッセージが出てくるのを見ている間に。私は、これはマウスに敏感であることができます(私は良いマウスを持って)理解

は、さえマウスパッド、OS、および手で任意のわずかな動きであってもよいし、これが発生する可能性があります。

私は誰かがこれを試してみて、あなたにも、この問題に気づくかどうかを確認し、誰かが、私はこれを最小限に抑えるためにMathematicaで行うことができますいくつかの設定を知っている場合ができればお願いしたいと思いました。私はEventHandlerのオプションを探していましたが、マウスをドラッグしていると判断したときに時間や遅延を設定しましたが、何も見えませんでした。ここで

は、私はちょうどこれが

おかげ

、Windows 7でのMathematica 8.0.1です

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 

上記のコードを実行した後にクリックしていたとき、私は私のシステムで何を得るの出力例です

+0

私は問題ありません。これで。私はちょうど "マウスクリック"を取得します。 (Ubuntu 11.04、Mma 8.0.1および7.0.1) – Simon

+0

お試しいただきありがとうございます。しかし、私のシステム(ウィンドウ7)上にある現在のプログラムでは、MouseDraggedイベントがMouseClickedイベントを盗んでいることが何度も分かります。私は数回のクリックをすることができます、そして、彼らはすべて代わりにMouseDraggedイベントに行きます。これにより、MouseDraggedはそのまま使えるようになりません。そこで、ControlKeyを押したときにドラッグするように変更しました。これでMouseClickedイベントとの競合はなくなりました。しかし、ControlKeyを押さえたままで画面上のポイントをドラッグすると、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

btw、上記のIF文のELSE部分になぜSequenc @ @ {}を追加したのかわかりませんか?私はそれらを取り除き、前と同じように機能しました。私はそこには正当な理由があると仮定していますが、私は今それを見ません。 – Nasser

+1

@Nasser問題は、マウスがクリックしながら動いていると、すぐに 'MouseDragged'が起動しないことです。最初にヒステリシスサイクルを挿入しようとしましたが、複雑になりました。私は上記のコードを大幅に改善することができると確信していますが、これはほんの始まりです。 'Sequence []'に関しては、必須の戻り値を持つ関数としてすべてを呼びたい場合に備えて、そこに置きます。その部分が役に立たないと感じたらそれを取り除く。 –

関連する問題