◆PROCESSING 逆引きリファレンス
カテゴリー:キーボード・マウス処理
マウスのダブルクリックを判定するには
【解説】
※本記事は、元々「マウスボタンが押された事を判定するには」記事に書いてあったものを、加筆修正した上で分離独立させたものです。
スマートフォンやタブレットでは、指でタッチしたりスワイプする操作が主流ですが、普通のパソコンでは、まだまだキーボードとマウスが主流です。
PROCESSINGにはmouseClicked() という、マウスクリックを検知する便利なイベント関数があります。mouseClicked() 関数については「マウスボタンが押された事を判定するには」記事で触れています。
マウスにはシングルクリック以外にも、連続でクリックを行う「ダブルクリック」という操作があります。
他の言語(VB.netやVC++など)ではダブルクリックを検知する専用のイベント関数があります。
ところが、残念なことにPROCESSINGにはダブルクリックを検知する専用のイベント関数はありません。
PROCESSINGの元になっているJavaに、ダブルクリックイベントを検知する専用リスナーがない為・・・と思われます(汗)。
それではPROCESSINGでマウスのダブルクリックを検知するには、どうすれば良いのでしょうか?。
mouseClicked() 関数には MouseEventクラスの変数を伴うものがあります。
イベント関数呼出し時に渡されるMouseEvent クラスのインスタンス変数が持つgetCount()メソッドを利用すると、マウスクリック時のクリック回数を取得する事が可能です。
PROCESSINGではこの回数を見て、ダブルクリックされたか否かを判定する事になります。
【構文】
int count = me . getCount( ) ;
count : クリック回数
※meはMouseEventクラスのインスタンス変数です。
【注意】
MouseEventクラスにはgetClickCount() というクリック回数を取得するメソッドもありますが、こちらは非推奨となっています。
クリック回数を取得するなら、getCount() メソッドを使う方が良いでしょう。
またPROCESSING(Java)は、あくまでシングルクリックを2回検知している事に注意が必要です。ダブルクリックを検知しているわけではありません。
ですので、実行結果ウィンドウの上でマウスをダブルクリックすると、実際にはmouseClicked() イベントが2回呼び出されます。
mouseClicked() イベント関数でgetCount()を実行すると、1回目の呼び出し時点では1が、2回目の(ダブルクリックとなる)呼び出し時点では2が得られます。
もちろん・・・あまりにもゆっくりとダブルクリックを行うと、シングルクリックが2回(つまりgetCount()が1を返すイベントが2回)発生する事にも注意が必要です(笑)。
どの程度素早くクリックすると、シングルクリックではなくダブルクリックと判定されるのかは不明ですが、私の環境で測定した限りでは概ね500ミリセカンド以内で連続クリックする必要がありました。
【関連記事】
- マウスボタンが押された事を判定するには
- マウスボタンが離された事を判定するには
- マウスが動かされた事を判定するには
- マウスホイールを判定するには
- マウスのどのボタンが押されたか調べるには
- マウスポインタの座標を知るには
サンプルプログラム
ダブルクリックを検知する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
PFont font; int clickCount; //クリック回数 public void setup() { size(300, 300); clickCount = 0; font = loadFont("IPAGothic-48.vlw"); textFont(font,32); textAlign(LEFT, TOP); frameRate(60); } public void draw() { background(255); fill(0); switch ( clickCount ){ case 0: break; case 1: text( "シングルクリック",0,16); break; case 2: text( "ダブルクリック",0,16); break; case 3: text( "トリプルクリック",0,16); break; default: text( "猛烈にクリック?",0,16); break; } } void mouseClicked( MouseEvent me ){ //クリック回数を取得 clickCount = me.getCount(); } |
上記サンプルでは、スケッチフォルダ(ソース格納場所)のdataフォルダ配下に、IPAGothic-48.vlw というIPAフォントファイル がある事が前提です。
mousePressed()関数に渡される MouseEvent変数を利用して、クリックされた回数を取得し、ボタンが何回連続で押されたかを判定しています
人に優しいダブルクリック検知例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
PFont font; //文字 long beforeTime; //以前のクリック時間 int clickCount; //クリック回数 String msg; public void setup() { size(300, 300); font = loadFont("IPAGothic-48.vlw"); textFont(font,24); textAlign(LEFT, TOP); beforeTime = 0; clickCount = 0; msg = ""; frameRate(60); } public void draw() { background(255); fill(0); text( msg, 0, 0 ); } void mouseClicked ( MouseEvent e ){ long nowClickTime; long sabunTime; //クリック回数を加算 clickCount = clickCount + 1; //今クリックされた時間を取得 nowClickTime = e.getMillis(); //前回クリックされた時との時間差を計算 sabunTime = (nowClickTime - beforeTime ); beforeTime = nowClickTime; switch( e.getCount() ){ case 1: //シングルクリックの場合でも //合計クリック回数が2回以上で //1秒以内の連続クリックなら //ダブルクリックとして扱う if( sabunTime < 1001 && clickCount > 1 ){ msg = "遅めのダブルクリック"; clickCount = 0; } else { msg = "シングルクリック"; } break; case 2: msg = "普通のダブルクリック"; clickCount = 0; break; case 3: msg = "トリプルクリック"; clickCount = 0; break; default: msg = "連打"; clickCount = 0; break; } } |
カチカチッと連続でクリックしたつもりが、遅すぎてダブルクリックと判定されない事ってありませんか?。何を隠そう、私も時々あります・・・(汗)。
上記ではMouseEventが持つgetMillis()メソッドで、マウス押下イベント発生時のシステム時間を取得し、前回のボタン押下時との時間差を求める事で、ゆっくりとダブルクリックした場合でも良いように工夫しています。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。