こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

仕事でJAVAを使ってWINDOWSのアプリ画面を作っています。
質問なのですが、マウスイベントで右ボタン、左ボタンどちらが押されたか
判定すると思いますが、
1.右ボタンが押された場合、左ボタンは押されているか?
という所で詰まっています。逆のパターンは判定できたのですが、何故か1のパターンが
判定できません。
・JAVAのバージョン(1.3.1)
・開発端末のOS(WindowsXP HomeEdition)
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( "右ボタンも押されています。" ) ;
}
}

// 右ボタンが押された場合
else if ( ( modifiers & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK )
{
// 右ボタンも押されているか?
if ( ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK )
{
// この判定には入らない。
System.out.println( "右ボタンも押されています。" ) ;
}
}
}
※(大雑把に書くとこんな感じです。)
個人的にはJAVAのバージョンに依存するものなのかなぁと考えているのですが、
1.3.1では駄目なのでしょうか?
乱文、雑文ではありますが、ぜひともご教授をお願いします。

投稿日時 - 2005-05-11 19:18:02

QNo.1381552

すぐに回答ほしいです

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

試しました。

質問者さんのコードをそのままコピペしました。
最初の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("片方のみ");
}
}
}

投稿日時 - 2005-05-11 20:36:43

お礼

すいません。弱冠間違ってました。
で、こちらで調べた所、バージョンが1.4以下の場合は
判定できない場合があるとの記述を見かけました。

(以下がそのサイトです。)
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/awt/AWTChanges.html

pcbeginnerさんがおっしゃられた「同時押しには入らない」部分に関しても何度も確認して入っていたので、
おかしいなと思っていました。
こちらのバージョンが1.3であるため、pcbeginnerさんと違う結果になっていたようです。

とりあえずどうするかまたこちらで考えたいと思います。
ご教授、ご指摘ありがとうございました。

投稿日時 - 2005-05-11 20:59:01

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

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

投稿日時 - 2005-05-12 13:42:16

補足

ご指摘ありがとうございます。
BUTTON1_MASKが正しいです。(実際のソースもそうなっています。)
混乱させてしまいすいません。

とりあえずreleaseのタイミングでのフラグ制御で対処してみようと思っています。

投稿日時 - 2005-05-12 14:28:43

ANo.6

>やはり皆さんが言うようにreleasedのタイミングでフラグ制御が一番良いのでしょうか?
う~ん。1番かどうかは分かりませんけど、
ぱっと思いついて、簡単にできそうなのは上記方法でしょうね…。(^^;A

自分もそんなに「発想」とか「閃き」がある方ではないので…。
(そういうのがすごい人が羨ましい。)

あとは
「右ボタンが押されたときに左ボタンが押されているか?」
っていうときの
・押されていた場合の処理(つまり同時押し)

・他のイベントで処理する
とかではないでしょうか?
(ユーザー(お客様)からの「どうしても」というお願いなら仕方ないですが…。)

たとえばボタンを1つ増やして対応とか…

いいアイデアではありませんが、代替案をあげるというのも1つの手かと…。

↑のことを「設計から考え直してみます。」と言っていたのなら余計なお世話でしたね。(^^;A
それでは。がんばって下さい。

投稿日時 - 2005-05-12 12:12:56

お礼

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

投稿日時 - 2005-05-12 14:28:32

ANo.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 を使用することをお勧めします。
---以上引用---------------------------------------

とあります。

それではがんばってください。

投稿日時 - 2005-05-12 09:38:56

お礼

おはようございます。

よく考えてみるとpcbeginnerさんのおっしゃる通りですよね。

BUTTON1_MASKやBUTTON3_MASK
を使用している時点で1.3でも1.4でも起こりえることですよね。

ただ、1.3では複数のボタンが押されていることを考慮されていないようなので、やはり皆さんが言うようにreleasedのタイミングでフラグ制御が一番良いのでしょうか?

もうちょっと設計から考え直してみます。ありがとうございます。

投稿日時 - 2005-05-12 10:40:19

ANo.4

 こんばんは。

>で、こちらで調べた所、バージョンが1.4以下の場合は
>判定できない場合があるとの記述を見かけました。

 少し誤解をされているようですね。
 1.4からならT0ngT0ngさんのおっしゃっているようにgetModifiersEx()を使って同時押しの判定ができますが、1.3だとこのメソッドがなく同時押しの判定ができないgetModifiers()を使わざるを得ません。
 その場合は、pcbeginnerさんのおっしゃっているようなフラグを立てる方法でやるしかないと思います。
 getModifiers()を使っている限り1.4と1.3の動作の違いは基本的にはありません。

 それと、

>実際の作りは右ボタンを押されたタイミング(pressed)
>でポップアップが出るのですが、

 ポップアップメニューの出るタイミングがおかしいような気がします。
 ちゃんと、MouseEventのisPopupTrigger()メソッドでポップアップを出すタイミングを計っていますか?

投稿日時 - 2005-05-11 21:16:37

補足

返答遅れて申し訳ありません。
やはりフラグ制御が良いのでしょうか?
もう少し設計を考え直してみようかな・・・。

ポップアップが出るタイミングについては少し文言がおかしかったです。申し訳ありません。

pressedのタイミングでポップアップが出る
 ↓
pressedのタイミングでshowメソッドを使いポップアップを出している
が正しいです。

pressedのタイミングで出すようにしているのは顧客からの要望なのでreleasedのタイミングで出すことは今のところありません。

投稿日時 - 2005-05-12 10:31:39

ANo.3

getModifiers()メソッドでは、そのイベントの発生元となったボタンしか戻ってきません。
そのイベント発生時に他のボタンの状態を調べる場合は、
getModifiersEx()を使用してください。
(この場合、判定するのは押されているかどうか、なので
見るべき定数はBUTTON1_DOWN_MASKとBUTTON3_DOWN_MASKになります。)

ただし、ご質問のコードの場合、全てelse文でつながっていますので、
両方押されている場合、最初の条件に入るため、後のほうの
2箇所には入りませんね。

投稿日時 - 2005-05-11 20:41:31

補足

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

投稿日時 - 2005-05-12 10:29:35

ANo.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()で話されたボタンのフラグを下げる。
というような感じにしないといけないのではないでしょうか???

投稿日時 - 2005-05-11 19:50:15

補足

早速の解答ありがとうございます。
私も始めは最初のif文(左⇒右の判定)に入るかどうか気になって試したのですが、
左ボタンの定数を無視して右ボタンの判定に入るようです。(確認済み。)
理由は分かりません。ネットで調べてみたんですが、良い情報がありませんでした。
反対に(右⇒左)の場合はpcbeginnerさんのおっしゃるとおりになるようです。

mouseReleaseのタイミングでフラグを立てる事も考えましたが、
実際の作りは右ボタンを押されたタイミング(pressed)でポップアップが出るのですが、
ポップアップが出るとmousePressed以降のイベント(clicked、Released)
のイベントが無視されるようで、フラグの制御が出来なくなって今います。
なのでフラグによる制御もあきらめました。

投稿日時 - 2005-05-11 19:58:07

あなたにオススメの質問