KeyEventの使い方がわかりません。  
下記のコードを実行すると

enableEvents(long)はComponentでprotectedアクセスされます

と、エラーがでます。

初歩的な質問だと思いますが検索してもわからず質問しました。  
どのように記述したらいいでしょうか。知恵を貸してください・・・

```

    public class Sample
    {
      public static void main (String[] args){
        javax.swing.JFrame.enableEvents(java.awt.AWTEvent.KEY_EVENT_MASK);
      }
      protected void processKeyEvent(java.awt.event.KeyEvent e){
        System.out.println("キーが押されました");
      }
    }
    
```
CC BY-SA 3.0
2017-03-21T07:09:16.340
33437
2017-03-22T04:53:19.947
2017-03-21T08:06:05.167
21137
21137
question
java
javaのprocessKeyEvent
`KeyEvent`は、コンポーネントに[KeyListener](https://docs.oracle.com/javase/8/docs/api/java/awt/event/KeyListener.html)を追加し、大抵の場合そこで使用します。

詳しくは、チュートリアルの[How to Write a Key Listener (The Java™ Tutorials > Creating a
GUI With JFC/Swing > Writing Event
Listeners)](https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html)が参考になると思います。

```

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class KeyEventTest {
      public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
          JFrame f = new JFrame();
          f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          f.addKeyListener(new KeyListener() {
            @Override public void keyPressed(KeyEvent e) {
              System.out.println("キーが押されたときに呼び出されます。" + e);
            }
            @Override public void keyReleased(KeyEvent e) {
              System.out.println("キーが離されたときに呼び出されます。" + e);
            }
            @Override public void keyTyped(KeyEvent e) {
              System.out.println("キーがタイプされたときに呼び出されます。" + e);
            }
          });
          f.setSize(320, 240);
          f.setLocationRelativeTo(null);
          f.setVisible(true);
        });
      }
    }
    
```
CC BY-SA 3.0
2017-03-21T07:32:59.277
33439
2017-03-21T07:32:59.277
46
33437
answer
まずキー入力の目的を考えねばなりません。  
コードを見る限り、JFrame（画面）に対してキー入力を受け付けたいだけのサンプル的なものだと思われます。  
本来であれば他の回答にあるように、コンポーネント外部からキー入力を受け取りたいということなのでKeyListenerを使うべきです。  
しかし、何らかの入門書籍やウェブサイトを見てprocessKeyEventを使われたと思いますので、その方法を示します。

```

    import java.awt.*;
    import java.awt.event.*;
    
    class Sample extends JFrame {
      public static void main(String[] args) {
        Sample frame = new Sample();
        frame.setVisible(true);
      }
    
      Sample() {
        enableEvents(AWTEvent.KEY_EVENT_MASK);
      }
      public void processKeyEvent(KeyEvent e){
        System.out.println("キーが押されました");
      }
    }
    
```

[processKeyEvent](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Component.html#processKeyEvent-
java.awt.event.KeyEvent-)メソッドは、独自のコンポーネントを定義する際に内部的に使用する用途で定義するものです。なので、上記のようにComponentのサブクラス内でオーバーライドしなければなりません。何も継承していないクラスに実装しても意味がありませんし、勝手に呼び出されることもありません。  
同様に[enableEvents](https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Component.html#enableEvents-
long-)もComponentのサブクラス内から呼び出すものです。protectedになっているのはその為です。
CC BY-SA 3.0
2017-03-22T04:53:19.947
33449
2017-03-22T04:53:19.947
19925
33437
answer