javaのメンバ変数についての質問です。
keyboardクラスにて、メンバ変数のkeycodeにkeyPressedメソッドから値を代入したいと思っています。keycodeはstaticにして、別クラスにてkeyboard.keycodeと書いて取得したキーによっていろいろな動作を行いたいと思っています。
ただ、keyPressedメソッドでkeycodeに値を入れることはできるのですが、そこからメンバ変数に入れることができません。
解決方法をお教え頂ければ幸いです。
追加
keyPressedメソッドでkeycodeに値を入れることはできていると思うのですが、
testメソッドにてkeycodeの値に応じて文字を出力するようにしているのですが、スペースキーを押しても文字が出力されません。
java
1class keyboard implements KeyListener { 2 static int keycode; 3 4 public void keyReleased(KeyEvent e) {} 5 public void keyTyped(KeyEvent e) {} 6 public void keyPressed(KeyEvent e){ 7 this.keycode = e.getKeyCode(); 8 } 9 public void test() { 10 if(keycode == KeyEvent.VK_SPACE) { 11 System.out.println("a"); 12 } 13 } 14}
java
1public class aaaa{ 2 public static frame frame; 3 public static void main(String[] args) { 4 frame = new frame(); 5 } 6}
java
1class frame extends JFrame { 2 public panel panel; 3 public frame() { 4 5 panel = new panel(); 6 this.addKeyListener(new keyboard()); 7 } 8}
コンパイルエラーだと思うのですが、それを直したいってことですか?
コンパイルエラーは表示されませんでした。値が代入できていないのが問題です。
失礼。Warningでした。
んー。
this.keycode = e.getKeyCode(); が呼ばれてる時点で、keycodeには値が設定されているはずなのですが。
他の要素としてJFrameを作成。そこでKeyListenerをaddしているのですがここに問題があるのですか。
現在のコードでは、keyboardクラスのstatic変数keycodeに値が正常にセットされているのですよね?
で、希望されている、メンバ変数というのは、どのクラスの何という変数なのでしょうか?
それとも、static変数keycodeに値がセットされない、という状況なのでしょうか?
> ただ、keyPressedメソッドでkeycodeに値を入れることはできるのですが、そこからメンバ変数に入れることができません。
あなたの言う「メンバ変数」ってどれの事ですか?
keyboardクラス直下のkeycodeのことです。構造的にはkeycodeに値がセットされるとは思うのですが・・・コンパイルエラーも出ていません。
> keyPressedメソッドでkeycodeに値を入れることはできるのですが、そこからメンバ変数に入れることができません。
は、以下のように読みかえればよいですか?
keyPressedメソッドでkeycodeに値を入れることはできるのですが、そこからkeyboardクラス直下のkeycodeに入れることができません。
とは、どういう状況なのでしょうか?
このコード以外でもいろいろと試していました。まずkeyboardクラス直下のkeycodeを宣言せず、直接keyPressedメソッドにてint keycode = e.getKeyCode();を行う。ただ、この場合keycodeを他クラスに渡す時(自分の場合はメインクラスです)インスタンス生成して(例:aaaa a = new aaaa();)クラス内のメソッドに値を渡す(a.main(keycode);)。ただ、public static void main(String[] args)の中でkeycodeをしたいので、aaaaクラス内のmainメソッド内に値を渡せません。(引数が違うので)
話を戻します。自分の知識不足で申し訳ないのですが、keyPressedメソッドでthis.keycodeはkeyboardクラス直下のメンバ変数keycodeを指すことだと思っています。
つまり、this.keycode=e.getKeyCode();とするこでクラス直下のメンバ変数keycodeにも値を代入が入ると認識しています。
しかし、同クラス内のtestメソッドにてkeycodeの値に応じて文字を出力するようにしているのですが、スペースキーを押しても文字が出力されません。つまり、クラス直下のメンバ変数keycodeに値が代入されていないということになります。
>keyPressedメソッドでkeycodeに値を入れることはできるのです(1)が、そこからkeyboardクラス直下のkeycodeに入れることができません(2)。
これは、自分の前提です。keycode = e.getKeyCode();とすることで値は代入できると思います(1)。ただ、this.と置いてもメンバ変数keycodeに値が代入されていません(2)。
質問を正しくしたほうがよいです。(質問を以下のように修正してください)
---
keyPressedメソッドでkeycodeに値を入れることはできていると思うのですが、
testメソッドにてkeycodeの値に応じて文字を出力するようにしているのですが、スペースキーを押しても文字が出力されません。
---
ですね。と、この質問だけでも理由はうすうすわかる気がしますが・・・
すみません、文章コピペして修正しました。変数keycodeはオブジェクト生成したときに作成されると思います。frameクラスにて this.addKeyListener(new keyboard());とすることでオブジェクト生成がなされていると思うんですけど勘違いですか。
インスタンスは作られてますが、test()を呼ぶ処理がないです。keyPressで自動で呼ばれるようなものじゃないです。
test()を呼ぶ処理については理解しました。ありがとうございます。ただmainメソッド内にてkeycodeを参照して動作を行う場合(if(keyboard.keycode == KeyEvent.VK_SPACE) {・・・ )としても、スペースキーを押しているにも関わらず動作が行われません。
イベントドリブンを理解されていないと思うのですが、mainにif文を書いてもキーを押したらmainの中身が呼ばれるわけじゃないのは理解されてますか?
単純なものなら、test()を keyPressの中に書けばいいと思いますけど。