• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マウスのボタン判定について)

マウスのボタン判定について

このQ&Aのポイント
  • JAVAを使用してWINDOWSのアプリ画面を作成する際のマウスイベントで、右ボタンと左ボタンのどちらが押されたかの判定方法について質問です。
  • 特に、右ボタンが押された場合に、同時に左ボタンも押されているかどうかを判定する方法がわからないとのことです。
  • 質問者はJAVAのバージョンが1.3.1であり、開発端末のOSはWindowsXP HomeEditionとのことです。この環境下では判定ができないのかどうかも疑問に思っています。ご教授いただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

試しました。 質問者さんのコードをそのままコピペしました。 最初のif文の // 右左同時押しの場合 if ( ( modifiers & InputEvent.BUTTON1_MASK ) == InputEvent.BUTTON1_MASK && ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入る。 System.out.println( "同時押しです。" ) ; } には入りませんでした。 上記判定に入るってことは true && false が true ってことになりますよ??? ここに載せてるソースと質問者さんが試しているソースが違うということはありませんか? 自分のはjavaのバージョンが1.4.2ですが、 true && false が true になることはないと思います…。 ついでに「右ボタンも押されています。」も両方とも同じメッセージなので、このメッセージだけで判断することは不可能だと思いますが…。 いちおう自分が試したソースを載せておくので、自分のものに間違いがあったらご指摘下さい。 (質問部分はコメントアウトしていて、同時判定版になっています…) ------------------------------------------------ import java.awt.*; import java.awt.event.*; public class Oshiete extends Frame implements MouseListener{ private boolean hidari = false; private boolean migi = false; public Oshiete(){ super(); setSize(100,100); addMouseListener(this); setVisible(true); } public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){ int hoge = e.getModifiers(); if(hoge == InputEvent.BUTTON1_MASK){ hidari = false; }else if(hoge == InputEvent.BUTTON3_MASK){ migi = false; } } public static void main(String args[]){ Oshiete o = new Oshiete(); } public void mousePressed( MouseEvent e ) { /* int modifiers = e.getModifiers(); // 右左同時押しの場合 if ( ( modifiers & InputEvent.BUTTON1_MASK ) == InputEvent.BUTTON1_MASK && ( modifiers & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK ) { // この判定には入る。 System.out.println( "同時押しです。" ) ; } // 左ボタンが押された場合 else if ( ( modifiers & InputEvent.BUTTON1_MASK ) == InputEvent.BUTTON1_MASK ) { // 右ボタンも押されているか? if ( ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入っている。 System.out.println( "右ボタンも押されています。hoge" ) ; } } // 右ボタンが押された場合 else if ( ( modifiers & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK ) { // 右ボタンも押されているか? if ( ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入らない。 System.out.println( "右ボタンも押されています。" ) ; } } */ int hoge = e.getModifiers(); if(hoge == InputEvent.BUTTON1_MASK){ hidari = true; }else if(hoge == InputEvent.BUTTON3_MASK){ migi = true; } if(hidari && migi){ System.out.println("同時押し"); }else{ System.out.println("片方のみ"); } } }

RYU_SAN
質問者

お礼

すいません。弱冠間違ってました。 で、こちらで調べた所、バージョンが1.4以下の場合は 判定できない場合があるとの記述を見かけました。 (以下がそのサイトです。) http://java.sun.com/j2se/1.4/ja/docs/ja/guide/awt/AWTChanges.html pcbeginnerさんがおっしゃられた「同時押しには入らない」部分に関しても何度も確認して入っていたので、 おかしいなと思っていました。 こちらのバージョンが1.3であるため、pcbeginnerさんと違う結果になっていたようです。 とりあえずどうするかまたこちらで考えたいと思います。 ご教授、ご指摘ありがとうございました。

その他の回答 (6)

  • kazsharp
  • ベストアンサー率37% (16/43)
回答No.7

提示されているソース、最後の判定で両方とも「InputEvent.BUTTON3_MASK」にしていますが、これでいいのですか?

RYU_SAN
質問者

補足

ご指摘ありがとうございます。 BUTTON1_MASKが正しいです。(実際のソースもそうなっています。) 混乱させてしまいすいません。 とりあえずreleaseのタイミングでのフラグ制御で対処してみようと思っています。

回答No.6

>やはり皆さんが言うようにreleasedのタイミングでフラグ制御が一番良いのでしょうか? う~ん。1番かどうかは分かりませんけど、 ぱっと思いついて、簡単にできそうなのは上記方法でしょうね…。(^^;A 自分もそんなに「発想」とか「閃き」がある方ではないので…。 (そういうのがすごい人が羨ましい。) あとは 「右ボタンが押されたときに左ボタンが押されているか?」 っていうときの ・押されていた場合の処理(つまり同時押し) を ・他のイベントで処理する とかではないでしょうか? (ユーザー(お客様)からの「どうしても」というお願いなら仕方ないですが…。) たとえばボタンを1つ増やして対応とか… いいアイデアではありませんが、代替案をあげるというのも1つの手かと…。 ↑のことを「設計から考え直してみます。」と言っていたのなら余計なお世話でしたね。(^^;A それでは。がんばって下さい。

RYU_SAN
質問者

お礼

いえ、こちらが難しく考えすぎているのだと思っています。 こちらの方も助けていただいてありがたいと思っていますので、気になさらないでください。

回答No.5

おはようございます。 おそらく質問者さんが >弱冠間違ってました。 とあるので、質問のソースが間違ってるのでしょう。 http://java.sun.com/j2se/1.4/ja/docs/ja/guide/awt/AWTChanges.html を読みましたが、 ---以下引用--------------------------------------- この欠陥を解決するために、次の定数が InputEvent に追加されました。 SHIFT_DOWN_MASK CTRL_DOWN_MASK META_DOWN_MASK ALT_DOWN_MASK ALT_GRAPH_DOWN_MASK BUTTON1_DOWN_MASK BUTTON2_DOWN_MASK …省略… ---以上引用--------------------------------------- とありますので、1.4を使用していても BUTTON1_MASKやBUTTON3_MASK を使用していれば同様のことが起きます。 1.4のInputEventのJavaDocにも ---以下引用--------------------------------------- BUTTON1_MASK public static final int BUTTON1_MASKマウスボタン 1 の定数です。代わりに、BUTTON1_DOWN_MASK を使用することをお勧めします。 ---以上引用--------------------------------------- とあります。 それではがんばってください。

RYU_SAN
質問者

お礼

おはようございます。 よく考えてみるとpcbeginnerさんのおっしゃる通りですよね。 BUTTON1_MASKやBUTTON3_MASK を使用している時点で1.3でも1.4でも起こりえることですよね。 ただ、1.3では複数のボタンが押されていることを考慮されていないようなので、やはり皆さんが言うようにreleasedのタイミングでフラグ制御が一番良いのでしょうか? もうちょっと設計から考え直してみます。ありがとうございます。

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.4

 こんばんは。 >で、こちらで調べた所、バージョンが1.4以下の場合は >判定できない場合があるとの記述を見かけました。  少し誤解をされているようですね。  1.4からならT0ngT0ngさんのおっしゃっているようにgetModifiersEx()を使って同時押しの判定ができますが、1.3だとこのメソッドがなく同時押しの判定ができないgetModifiers()を使わざるを得ません。  その場合は、pcbeginnerさんのおっしゃっているようなフラグを立てる方法でやるしかないと思います。  getModifiers()を使っている限り1.4と1.3の動作の違いは基本的にはありません。  それと、 >実際の作りは右ボタンを押されたタイミング(pressed) >でポップアップが出るのですが、  ポップアップメニューの出るタイミングがおかしいような気がします。  ちゃんと、MouseEventのisPopupTrigger()メソッドでポップアップを出すタイミングを計っていますか?

RYU_SAN
質問者

補足

返答遅れて申し訳ありません。 やはりフラグ制御が良いのでしょうか? もう少し設計を考え直してみようかな・・・。 ポップアップが出るタイミングについては少し文言がおかしかったです。申し訳ありません。 pressedのタイミングでポップアップが出る  ↓ pressedのタイミングでshowメソッドを使いポップアップを出している が正しいです。 pressedのタイミングで出すようにしているのは顧客からの要望なのでreleasedのタイミングで出すことは今のところありません。

  • T0ngT0ng
  • ベストアンサー率40% (8/20)
回答No.3

getModifiers()メソッドでは、そのイベントの発生元となったボタンしか戻ってきません。 そのイベント発生時に他のボタンの状態を調べる場合は、 getModifiersEx()を使用してください。 (この場合、判定するのは押されているかどうか、なので 見るべき定数はBUTTON1_DOWN_MASKとBUTTON3_DOWN_MASKになります。) ただし、ご質問のコードの場合、全てelse文でつながっていますので、 両方押されている場合、最初の条件に入るため、後のほうの 2箇所には入りませんね。

RYU_SAN
質問者

補足

おはようございます。返答遅れて申し訳ありません。 getModifiersEx()メソッドについても調べたのですが、 1.3だと無いようです。

回答No.1

自分の勘違いだったらごめんなさい。 (実際に動かしてはいないのですが…。) 左右同時の場合は、この判定には入るとありますが本当に入りますか? int modifiers = e.getModifiers(); としているので、modifiersには左ボタン定数の値が入ってますよね? そうすると最初のif文の条件の ( modifiers & InputEvent.BUTTON1_MASK ) == InputEvent.BUTTON1_MASK はtrueになります。 でもその次の条件の ( modifiers & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK はfalseになりませんか?この条件を判断するときの modifiers は左ボタン定数のままですよね? 大雑把に書いたとのことなので、実際はこうではないのかもしれませんが、 mousePressed() が呼ばれるのは1つのボタンが押されたときですので、同時押しを判定するとしたら 左ボタン押したフラグ と 右ボタン押したフラグ を作って、 mousePressed()で押されたボタンのフラグを立てて、もう一方のボタンのフラグの状態を判別する。 mouseReleasee()で話されたボタンのフラグを下げる。 というような感じにしないといけないのではないでしょうか???

RYU_SAN
質問者

補足

早速の解答ありがとうございます。 私も始めは最初のif文(左⇒右の判定)に入るかどうか気になって試したのですが、 左ボタンの定数を無視して右ボタンの判定に入るようです。(確認済み。) 理由は分かりません。ネットで調べてみたんですが、良い情報がありませんでした。 反対に(右⇒左)の場合はpcbeginnerさんのおっしゃるとおりになるようです。 mouseReleaseのタイミングでフラグを立てる事も考えましたが、 実際の作りは右ボタンを押されたタイミング(pressed)でポップアップが出るのですが、 ポップアップが出るとmousePressed以降のイベント(clicked、Released) のイベントが無視されるようで、フラグの制御が出来なくなって今います。 なのでフラグによる制御もあきらめました。

関連するQ&A