Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

キーイベントについて。

このようなコードを書くにはどうすればいいですか?

public static void stop(){
   while(true){
      if(エンターキーが押された){
         break;
      }
   }
}

15

回答

93520

閲覧

15件の回答

評価

0

メモ帳でも開けば書けるよ。

評価

0

わろたw
java キーイベント
で調べればいくらでも出てくるよ
swing キーイベントとかかな

評価

0

キーが押された時の処理は沢山ありますが押されるまで待つ
処理がありませんでした。
そこでエンターキーが押されるまで待つ処理を知りたくて質
問しました。

評価

0

「Enterキーを押された」のを直接取ろうとせずに、Enterキ
ーが押されたら「状態」を変更するようにしておいて、その
状態が変わるまで待つんだよ。

評価

0

このようなプログラムを作ってみましたが上手く動きませ
ん。
何故でしょうか?
import java.awt.event.*;
public class Key implements KeyListener{
    
    static int KeyCode;
    @Override
    public void keyPressed(KeyEvent event){//押され

        KeyCode = event.getKeyCode();//キーコード
    }
    
    @Override
    public void keyReleased(KeyEvent event){//離され

    }
    
    @Override
    public void keyTyped(KeyEvent event){//押して離
した
    }
    static void stop(){
        KeyCode=0;
        while(true){
            if(KeyCode==10){
                break;
            }
        }
    }
}

評価

0

どこがうまくいかないのか、自分で試せることはないのか?

評価

0

別スレッドで処理しないといけないとそんな感じじゃないのかな

評価

0

>キーが押された時の処理は沢山ありますが押されるまで
待つ
処理がありませんでした。

それは、そういう処理の仕方は基本的ではないからです。
キー入力のようなイベントは必ずEDTスレッドという特別
なスレッドで実行されます。EDTスレッドはイベントを受
けたらごく短い処理を直ちに行って次のイベントを待つ動
作へ戻らなくてはなりません。よって「キーがおされるま
で待つ」という処理をどうしてもやりたければEDTとは別
のスレッドを自分で起こしてそこでやることになります。
しかし「キーが押されるまで待つ」という処理はたいてい
は何かのイベントの処理の延長でやるものなので結局スレ
ッド間の同期などややこしい処理をすることになり、それ
はJavaのイベント処理を充分理解した上で初めてできるこ
となので、おみうけした限りでは質問者さんにはオススメ
しません。

前の回答者のかたもおっしゃてますが、イベント処理の考
え方を変えて、「キーがおされるまで待つ」処理を考える
のではなく、「キーがおされたら状態を変える(たとえば
表示内容を変えるとか)」という考え方でプログラムを考
えてみてください。

評価

0

詳しく説明ありがとうございます。
今のRPGゲームを作っています。
RPGは会話がありますよね?その時に会話をエンターで進
めたいです。
その場合呼び出すとエンターが押されるまで待つメソッド
があると
会話文
待つ
会話文
待つ
のようにその後のプログラムを簡単に作ることが出来ま
す。
ただキーが押された時に処理をする方法ではどのように作
ればいいかいまいち分かりません。

評価

0

「待つ」を字面どおり、「その場で待つ」と考えるから、
与えられたものを使えないんだ。
Swingもそうだが、イベント型のプログラムでは「待つ」
というのは基本的に「何もせずに終わる」ということにな
る。
つまり、「状態が整ったら次(の文)へ進む」「状態が整
ってなかったら何もしない」ということだ。




どうでもいいが、「RPG」のGは「Game」なので「RPG」に
「ゲーム」は付けないでいいぞ。

評価

0

Keyイベントを受け取るクラスを作りましたがキーを押し
ても反応しません。何故でしょうか?フレームには    
addKeyListener(new Key());でイベント登録しています。

import java.awt.event.*;
public class Key implements KeyListener{
    static int f=-1;//何を受け取るか。-1=受け取らな
い、0=エンター、1〜9=数字
    static int k=-1;//何を押されたか。-1=押されてな
い。0=エンター、1〜9=数字
    static int kc;
    @Override
    public void keyPressed(KeyEvent event){//押され

        kc = event.getKeyCode();//キーコード
        System.out.println(kc+"を押した");
        if(f==0){
            if(kc==10){
                k=0;
            }
        }
        if(f==1){
            if(kc==49|kc==97){
                k=1;
            }
        }else if(f==2){
            if(kc==49||kc==97){
                k=1;
            }else if(kc==50||kc==98){
                k=2;
            }
        }else if(f==3){
            if(kc==49||kc==97){
                k=1;
            }else if(kc==50||kc==98){
                k=2;
            }else if(kc==51||kc==99){
                k=3;
            }
        }else if(f==4){
            if(kc==49||kc==97){
                k=1;
            }else if(kc==50||kc==98){
                k=2;
            }else if(kc==51||kc==99){
                k=3;
            }else if(kc==52||kc==100){
                k=4;
            }
        }else if(f==5){
            if(kc==49||kc==97){
                k=1;
            }else if(kc==50||kc==98){
                k=2;
            }else if(kc==51||kc==99){
                k=3;
            }else if(kc==52||kc==100){
                k=4;
            }else if(kc==53||kc==101){
                k=5;
            }
        }else if(f==6){
            if(kc==49||kc==97){
                k=1;
            }else if(kc==50||kc==98){
                k=2;
            }else if(kc==51||kc==99){
                k=3;
            }else if(kc==52||kc==100){
                k=4;
            }else if(kc==53||kc==101){
                k=5;
            }else if(kc==54||kc==102){
                k=6;
            }
        }else if(f==7){
            if(kc==49||kc==97){
                k=1;
            }else if(kc==50||kc==98){
                k=2;
            }else if(kc==51||kc==99){
                k=3;
            }else if(kc==52||kc==100){
                k=4;
            }else if(kc==53||kc==101){
                k=5;
            }else if(kc==54||kc==102){
                k=6;
            }else if(kc==55||kc==103){
                k=7;
            }
        }else if(f==8){
            if(kc==49||kc==97){
                k=1;
            }else if(kc==50||kc==98){
                k=2;
            }else if(kc==51||kc==99){
                k=3;
            }else if(kc==52||kc==100){
                k=4;
            }else if(kc==53||kc==101){
                k=5;
            }else if(kc==54||kc==102){
                k=6;
            }else if(kc==55||kc==103){
                k=7;
            }else if(kc==56||kc==104){
                k=8;
            }
        }else if(f==9){
            if(kc==49||kc==97){
                k=1;
            }else if(kc==50||kc==98){
                k=2;
            }else if(kc==51||kc==99){
                k=3;
            }else if(kc==52||kc==100){
                k=4;
            }else if(kc==53||kc==101){
                k=5;
            }else if(kc==54||kc==102){
                k=6;
            }else if(kc==55||kc==103){
                k=7;
            }else if(kc==56||kc==104){
                k=8;
            }else if(kc==57||kc==105){
                k=9;
            }
        }
    }
    @Override
    public void keyReleased(KeyEvent event){//離され

    }
    
    @Override
    public void keyTyped(KeyEvent event){//押して離
した
    }
    static int getK(){
        return k;
    }
    static void setK(){
        k=-1;
    }
    static void setF(int a){
        f=a;
    }
}

評価

0

たくさん書く前に、まずは最小限のコードでちゃんと動くか
確認するんだよ。

そして、書いたら書いたでどこまでが想定通りでどこからお
かしいか、追って行くんだ。
これをデバックという。

評価

0

フレームに張り付けられているコンポーネントがキーイベントを
消費しているのだと思います。
テキストフィールドやテキストエリア、ボタンなどにフォーカスがある時には
キーイベントはそれらが処理するのでフレームにキーリスナーを登録していても
イベントは伝わりません。

評価

0

編集不可のテキストエリアもイベントを消費するのでしょう
か?
ラベルの代わりに編集不可テキストエリアを使っています。

評価

0

>編集不可のテキストエリアもイベントを消費するのしょうか?
分かりません。
まずテスト用のフレームを作成してKeyオブジェクトをキーリスナーとして登録してみて
想定通りに動くことを確認した後にテキストエリアを張り付けて
キーイベントがフレームに伝わらなくなるのを確認後にテキストエリアを
編集不可にしてみて試してください。

"KeyEventを全部横取りする "で検索してみてください。
トップに来たサイトにKeyEventDispatcherとKeyEventPostProcessor
について記述があります。
おそらくKeyEventPostProcessorでtkrさんのやりたい事ができるのではないかと思います。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。