質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

1063閲覧

java メンバ変数について

white_

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/08/05 12:49

編集2020/08/06 03:52

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2020/08/05 12:58

コンパイルエラーだと思うのですが、それを直したいってことですか?
white_

2020/08/05 13:07

コンパイルエラーは表示されませんでした。値が代入できていないのが問題です。
momon-ga

2020/08/05 13:21 編集

失礼。Warningでした。 んー。 this.keycode = e.getKeyCode(); が呼ばれてる時点で、keycodeには値が設定されているはずなのですが。
white_

2020/08/05 13:44

他の要素としてJFrameを作成。そこでKeyListenerをaddしているのですがここに問題があるのですか。
YT0014

2020/08/05 16:20

現在のコードでは、keyboardクラスのstatic変数keycodeに値が正常にセットされているのですよね? で、希望されている、メンバ変数というのは、どのクラスの何という変数なのでしょうか? それとも、static変数keycodeに値がセットされない、という状況なのでしょうか?
swordone

2020/08/05 17:02

> ただ、keyPressedメソッドでkeycodeに値を入れることはできるのですが、そこからメンバ変数に入れることができません。 あなたの言う「メンバ変数」ってどれの事ですか?
white_

2020/08/05 22:57

keyboardクラス直下のkeycodeのことです。構造的にはkeycodeに値がセットされるとは思うのですが・・・コンパイルエラーも出ていません。
momon-ga

2020/08/06 00:45 編集

> keyPressedメソッドでkeycodeに値を入れることはできるのですが、そこからメンバ変数に入れることができません。 は、以下のように読みかえればよいですか? keyPressedメソッドでkeycodeに値を入れることはできるのですが、そこからkeyboardクラス直下のkeycodeに入れることができません。 とは、どういう状況なのでしょうか?
white_

2020/08/06 01:30

このコード以外でもいろいろと試していました。まず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)。
momon-ga

2020/08/06 01:55

質問を正しくしたほうがよいです。(質問を以下のように修正してください) --- keyPressedメソッドでkeycodeに値を入れることはできていると思うのですが、 testメソッドにてkeycodeの値に応じて文字を出力するようにしているのですが、スペースキーを押しても文字が出力されません。 --- ですね。と、この質問だけでも理由はうすうすわかる気がしますが・・・
white_

2020/08/06 02:05

すみません、文章コピペして修正しました。変数keycodeはオブジェクト生成したときに作成されると思います。frameクラスにて this.addKeyListener(new keyboard());とすることでオブジェクト生成がなされていると思うんですけど勘違いですか。
momon-ga

2020/08/06 02:07

インスタンスは作られてますが、test()を呼ぶ処理がないです。keyPressで自動で呼ばれるようなものじゃないです。
white_

2020/08/06 02:24

test()を呼ぶ処理については理解しました。ありがとうございます。ただmainメソッド内にてkeycodeを参照して動作を行う場合(if(keyboard.keycode == KeyEvent.VK_SPACE) {・・・ )としても、スペースキーを押しているにも関わらず動作が行われません。
momon-ga

2020/08/06 03:11 編集

イベントドリブンを理解されていないと思うのですが、mainにif文を書いてもキーを押したらmainの中身が呼ばれるわけじゃないのは理解されてますか? 単純なものなら、test()を keyPressの中に書けばいいと思いますけど。
guest

回答2

0

momon-gaさんの回答のように、test()が呼ばれてないのと、
同じようにaddActionLisner()しているyachtframe()がmain()内で呼ばれてないですね。
あと、panelクラスの実装が不明ですが、Jpanelの継承でよいのかな。

その前提でいくと、下記のような感じですかね。

Main

1import java.awt.Container; 2 3public class Main{ 4 public static MyFrame frame; 5 public static MyPanel panel; 6 public static void main(String[] args) { 7 frame = new MyFrame(); 8 panel = new MyPanel(); 9 10 Container container = frame.getContentPane(); 11 container.add(panel); 12 frame.yachtframe(); 13 frame.setVisible(true); 14 } 15} 16

KeyBoard

1import java.awt.event.KeyEvent; 2import java.awt.event.KeyListener; 3 4class Keyboard implements KeyListener { 5 static int keycode; 6 7 public void keyReleased(KeyEvent e) {} 8 9 public void keyTyped(KeyEvent e) {} 10 11 public void keyPressed(KeyEvent e){ 12 this.keycode = e.getKeyCode(); 13 test(); 14 } 15 public void test() { 16 if(keycode == KeyEvent.VK_SPACE) { 17 System.out.println("a"); 18 } 19 } 20}

MyFrame

1import javax.swing.*; 2 3class MyFrame extends JFrame { 4 public MyPanel panel; 5 public void yachtframe() { 6 panel = new MyPanel(); 7 this.addKeyListener(new Keyboard()); 8 } 9}

MyPanel

1import javax.swing.*; 2public class MyPanel extends JPanel{ 3 4}

最後に、必ず強制されるものではないですが、
Javaではクラス名の先頭の文字は大文字にする慣習があります。
大抵のエディタやIDEではwarningが出るくらい浸透している慣習です。

メソッドなら先頭小文字、
クラス名とコンストラクタ(クラスと同名)は先頭大文字です。
それに従ってクラス名は少し直しました。

投稿2020/08/06 03:43

Marie

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

keyPressedメソッドでkeycodeに値を入れることはできていると思うのですが、

testメソッドにてkeycodeの値に応じて文字を出力するようにしているのですが、スペースキーを押しても文字が出力されません。

keyuPressedイベントの発生とtestメソッドは関連がないので、明示的に呼び出す必要があります。

java

1public void keyPressed(KeyEvent e){ 2 this.keycode = e.getKeyCode(); 3 test(); 4}

じゃあ、他のクラスで使ってるkeyを判定するには、どうすればよいか?
いわゆる通知用のクラスを使うか、keyboardクラスの内部に持てばよいと思います。
※なんちゃらLisnerを自前でやってる感じです

java

1class keyboard implements KeyListener { 2 static int keycode; 3 SomeClass action; 4 5 keyboard (SomeClass action) { 6 this.action = action; 7 } 8 public void keyPressed(KeyEvent e){ 9 this.keycode = e.getKeyCode(); 10 action.someMethod(keycode); 11 } 12}

投稿2020/08/06 03:22

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問