teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

最初の質問に対する内容を削除し、追記部分だけに修正した。

2015/07/21 03:25

投稿

eripong
eripong

スコア1546

answer CHANGED
@@ -1,57 +1,4 @@
1
- おそらく、簡略化の誤りと思いますが、`Trumpgui`が`public void`であるのに
2
- `new Trumpgui()`されていたりして、そもそもおかしい状態です。
3
-
4
- 問題が再現するプログラムを投稿してください。
5
- 処理の流れの誤りで動かない場合もあるため、
6
- 簡略化すると、問題個所が消えてしまう可能性もあります。
7
-
8
- 一応、以下のようにしたら「キータイプ済み」と表示されるようになりました。
9
-
10
- ```lang-java
11
- package q13144;
12
-
13
- import java.awt.BorderLayout;
14
- import java.awt.event.KeyEvent;
15
- import java.awt.event.KeyListener;
16
-
17
- import javax.swing.JFrame;
18
- import javax.swing.JPanel;
19
-
20
- public class Trump extends JPanel implements KeyListener {
21
- public Trump() {
22
- }
23
-
24
- public void keyTyped(KeyEvent e) {
25
- System.out.println("キータイプ済み");
26
- repaint();
27
- }
28
- public void keyPressed(KeyEvent e) {
29
- }
30
- public void keyReleased(KeyEvent e) {
31
- }
32
-
33
- public void Trumpgui() {
34
- setFocusable(true);
35
- addKeyListener(this);
36
- }
37
-
38
- public static void main(String[] args) {
39
- JFrame Trumpframe = new JFrame("JPanel");
40
- Trumpframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
41
- Trump s = new Trump();
42
- s.Trumpgui(); // Trumpguiがメソッドだったので呼び出すように修正した。
43
- // Trumpgui h = new Trumpgui(); // Trumpguiというクラスはなかったのでコメントアウトした。
44
- // Trumpframe.add(h, BorderLayout.CENTER); // Trumpguiというクラスはなかったのでコメントアウトした。
45
- Trumpframe.add(s, BorderLayout.CENTER); // Trumpguiの代わりにTrumpを追加するよう修正した。
46
- Trumpframe.requestFocus();
47
- Trumpframe.pack();
48
- Trumpframe.setVisible(true);
49
- }
50
- }
51
- ```
52
-
53
- ### 追記
54
- 全文掲載していただいたコードを実行し、
1
+ このコードを実行し、
55
2
  デバッガで止めると、`keyTyped`メソッドは呼ばれています。
56
3
 
57
4
  `KeyEvent#getKeyCode`を使っていますが、

2

表現を修正した。

2015/07/21 03:25

投稿

eripong
eripong

スコア1546

answer CHANGED
@@ -57,8 +57,8 @@
57
57
  `KeyEvent#getKeyCode`を使っていますが、
58
58
  [KeyEventのJavaDoc](https://docs.oracle.com/javase/jp/8/api/java/awt/event/KeyEvent.html)を見ると、
59
59
  「キー・タイプ・イベントに対しては、getKeyCodeメソッドは常にVK_UNDEFINEDを返します。」
60
- とある通り、keyTypedではこのメソッドは常に`VK_UNDEFINED`を返すので、
60
+ とある通り、keyTypedではこのメソッドは常に`VK_UNDEFINED`(0)を返すので、
61
- 何もしない結果になっています。
61
+ if文のどの分岐にも入らず、何もしていないように見える結果になっています。
62
62
 
63
63
  「getKeyCharメソッドは常に有効なUnicode文字またはCHAR_UNDEFINEDを返します。文字入力はKEY_TYPEDイベントによって報告されます。
64
64
  KEY_PRESSEDおよびKEY_RELEASEDイベントは必ずしも文字入力に関連付けられていません。

1

コードが再投稿されたのでそれに対応した。

2015/07/21 02:52

投稿

eripong
eripong

スコア1546

answer CHANGED
@@ -48,4 +48,28 @@
48
48
  Trumpframe.setVisible(true);
49
49
  }
50
50
  }
51
- ```
51
+ ```
52
+
53
+ ### 追記
54
+ 全文掲載していただいたコードを実行し、
55
+ デバッガで止めると、`keyTyped`メソッドは呼ばれています。
56
+
57
+ `KeyEvent#getKeyCode`を使っていますが、
58
+ [KeyEventのJavaDoc](https://docs.oracle.com/javase/jp/8/api/java/awt/event/KeyEvent.html)を見ると、
59
+ 「キー・タイプ・イベントに対しては、getKeyCodeメソッドは常にVK_UNDEFINEDを返します。」
60
+ とある通り、keyTypedではこのメソッドは常に`VK_UNDEFINED`を返すので、
61
+ 何もしない結果になっています。
62
+
63
+ 「getKeyCharメソッドは常に有効なUnicode文字またはCHAR_UNDEFINEDを返します。文字入力はKEY_TYPEDイベントによって報告されます。
64
+ KEY_PRESSEDおよびKEY_RELEASEDイベントは必ずしも文字入力に関連付けられていません。
65
+ そのため、getKeyCharメソッドの結果は、KEY_TYPEDイベントに対してのみ有効です。」
66
+
67
+ という記述のある、`KeyEvent#getKeyChar`を使用してください。
68
+
69
+ それから、蛇足かもしれませんが、
70
+ メソッドが呼ばれているかどうかを調べる場合は、
71
+ メソッドの先頭に(今回であれば`int key = e.getKeyCode();`)ブレークポイントを入れるか、
72
+ それより前にデバッグプリントを入れる様にした方が良いと思います。
73
+
74
+
75
+