仕事で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では駄目なのでしょうか?
乱文、雑文ではありますが、ぜひともご教授をお願いします。
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("片方のみ");
}
}
}
すいません。弱冠間違ってました。
で、こちらで調べた所、バージョンが1.4以下の場合は
判定できない場合があるとの記述を見かけました。
(以下がそのサイトです。)
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/aw …
pcbeginnerさんがおっしゃられた「同時押しには入らない」部分に関しても何度も確認して入っていたので、
おかしいなと思っていました。
こちらのバージョンが1.3であるため、pcbeginnerさんと違う結果になっていたようです。
とりあえずどうするかまたこちらで考えたいと思います。
ご教授、ご指摘ありがとうございました。
No.6
- 回答日時:
>やはり皆さんが言うようにreleasedのタイミングでフラグ制御が一番良いのでしょうか?
う~ん。1番かどうかは分かりませんけど、
ぱっと思いついて、簡単にできそうなのは上記方法でしょうね…。(^^;A
自分もそんなに「発想」とか「閃き」がある方ではないので…。
(そういうのがすごい人が羨ましい。)
あとは
「右ボタンが押されたときに左ボタンが押されているか?」
っていうときの
・押されていた場合の処理(つまり同時押し)
を
・他のイベントで処理する
とかではないでしょうか?
(ユーザー(お客様)からの「どうしても」というお願いなら仕方ないですが…。)
たとえばボタンを1つ増やして対応とか…
いいアイデアではありませんが、代替案をあげるというのも1つの手かと…。
↑のことを「設計から考え直してみます。」と言っていたのなら余計なお世話でしたね。(^^;A
それでは。がんばって下さい。
いえ、こちらが難しく考えすぎているのだと思っています。
こちらの方も助けていただいてありがたいと思っていますので、気になさらないでください。
No.5
- 回答日時:
おはようございます。
おそらく質問者さんが
>弱冠間違ってました。
とあるので、質問のソースが間違ってるのでしょう。
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/aw …
を読みましたが、
---以下引用---------------------------------------
この欠陥を解決するために、次の定数が 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 を使用することをお勧めします。
---以上引用---------------------------------------
とあります。
それではがんばってください。
おはようございます。
よく考えてみるとpcbeginnerさんのおっしゃる通りですよね。
BUTTON1_MASKやBUTTON3_MASK
を使用している時点で1.3でも1.4でも起こりえることですよね。
ただ、1.3では複数のボタンが押されていることを考慮されていないようなので、やはり皆さんが言うようにreleasedのタイミングでフラグ制御が一番良いのでしょうか?
もうちょっと設計から考え直してみます。ありがとうございます。
No.4
- 回答日時:
こんばんは。
>で、こちらで調べた所、バージョンが1.4以下の場合は
>判定できない場合があるとの記述を見かけました。
少し誤解をされているようですね。
1.4からならT0ngT0ngさんのおっしゃっているようにgetModifiersEx()を使って同時押しの判定ができますが、1.3だとこのメソッドがなく同時押しの判定ができないgetModifiers()を使わざるを得ません。
その場合は、pcbeginnerさんのおっしゃっているようなフラグを立てる方法でやるしかないと思います。
getModifiers()を使っている限り1.4と1.3の動作の違いは基本的にはありません。
それと、
>実際の作りは右ボタンを押されたタイミング(pressed)
>でポップアップが出るのですが、
ポップアップメニューの出るタイミングがおかしいような気がします。
ちゃんと、MouseEventのisPopupTrigger()メソッドでポップアップを出すタイミングを計っていますか?
この回答への補足
返答遅れて申し訳ありません。
やはりフラグ制御が良いのでしょうか?
もう少し設計を考え直してみようかな・・・。
ポップアップが出るタイミングについては少し文言がおかしかったです。申し訳ありません。
pressedのタイミングでポップアップが出る
↓
pressedのタイミングでshowメソッドを使いポップアップを出している
が正しいです。
pressedのタイミングで出すようにしているのは顧客からの要望なのでreleasedのタイミングで出すことは今のところありません。
No.3
- 回答日時:
getModifiers()メソッドでは、そのイベントの発生元となったボタンしか戻ってきません。
そのイベント発生時に他のボタンの状態を調べる場合は、
getModifiersEx()を使用してください。
(この場合、判定するのは押されているかどうか、なので
見るべき定数はBUTTON1_DOWN_MASKとBUTTON3_DOWN_MASKになります。)
ただし、ご質問のコードの場合、全てelse文でつながっていますので、
両方押されている場合、最初の条件に入るため、後のほうの
2箇所には入りませんね。
この回答への補足
おはようございます。返答遅れて申し訳ありません。
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()で話されたボタンのフラグを下げる。
というような感じにしないといけないのではないでしょうか???
この回答への補足
早速の解答ありがとうございます。
私も始めは最初のif文(左⇒右の判定)に入るかどうか気になって試したのですが、
左ボタンの定数を無視して右ボタンの判定に入るようです。(確認済み。)
理由は分かりません。ネットで調べてみたんですが、良い情報がありませんでした。
反対に(右⇒左)の場合はpcbeginnerさんのおっしゃるとおりになるようです。
mouseReleaseのタイミングでフラグを立てる事も考えましたが、
実際の作りは右ボタンを押されたタイミング(pressed)でポップアップが出るのですが、
ポップアップが出るとmousePressed以降のイベント(clicked、Released)
のイベントが無視されるようで、フラグの制御が出来なくなって今います。
なのでフラグによる制御もあきらめました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Java Javaプログラミングの質問になります。 ボタンを押下した時に画面遷移して 画面から戻ってきた時のi 1 2023/06/26 07:50
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- 地図・道路 交通量の多い道路沿いに建つ学校で勤務しております。 校門には、押しボタン信号があります。 学校で働く 1 2022/09/16 18:57
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- JavaScript HTMLでJavaScriptを使用してプログラムを作ります。 入力されたパスワードを取得して、パス 2 2022/10/18 01:05
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) VBA 画面上のカーソルに文字数字を入力するコードを教えて下さい 1 2022/10/30 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DataGridViewのチェックボック...
-
c# 文字列の最後から1文字削除...
-
JSPでボタンを押したら、文字が...
-
ブラウザの×ボタン(閉じるボタ...
-
ボタンの形
-
ロストフォーカスイベントとそ...
-
クリック連打ソフト作成
-
javascriptでボタンが押下され...
-
【C#】 : WindowsProgramming ...
-
Acrobatのツールボタンの消し方
-
PreTranslateMessageで音がする
-
エクセル2007でシート見出...
-
アクティブウィンドウと非アク...
-
JSPでメッセージボックスを表示...
-
ボタン1を押すと…
-
VBAで一時中断したプログラムの...
-
getParameterで値が取得できず...
-
コネクション・セッション・ト...
-
INPUTのボタン周囲のスペース
-
ボタンをクリックした時に、入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c# 文字列の最後から1文字削除...
-
DataGridViewのチェックボック...
-
VBAで一時中断したプログラムの...
-
Eclipseでクリーンが出来ない
-
ブラウザの×ボタン(閉じるボタ...
-
メール添付されたPDFファイルが...
-
グリッドビューでのチェックボ...
-
SPREADでカーソルの位置を1行目...
-
EXCEL2010でセルが編集中かを判...
-
CheckBoxをボタン形式にして押...
-
最大化ボタンと最小化ボタンを...
-
Ctrlキーを押しながらのダブル...
-
IEの閉じるボタンを消す方法
-
今更、VBAでRPA、キーボード操...
-
C# Enterキーの動作について
-
Page_Load時にボタンクリックイ...
-
Webブラウザの閉じるボタン無効...
-
【C#】 : WindowsProgramming ...
-
Fancyboxのiframe内に閉じるボタン
-
VBのこのコードの意味を教えて...
おすすめ情報