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

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

ただいまの
回答率

90.12%

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerExceptionエラー

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,094

lovekasutera

score 5

package pack;

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.TextComponent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class TypingSample2 {

    private JFrame frmTypesample;
    long ptime; //プレスされた時間
    long rtime;//リリースされた時間
    long time [][] = new long[1000][1000];//
    long[][] c = new long [1000][1000];//出現頻度カウント用
    long avTime[][] = new long [1000][1000];//平均時間
    int firstkey=0;//
    int secondkey=0;
    int count;
    String userstr;
    String pristr[]={"トウカイダイガク","メイジダイガク","ヤマモトセンセイ","ケンキュウシツ","ツウシンネットワーク",
            "ゼミナール","ズートピア","チイバス","クォーター","ミディアム",
            "ライブビューイング","ゲンダイブンメイロン","ページフォルト","セカイゾウノヘンセン","アイデンティティトキョウセイ",
            "チイキシャカイ","チェックポイント","ファストフード","フーリエヘンカン","ゼンゼンゼンセ"};
    int r = 0;

    public TextComponent textField;
    /**
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TypingSample2 window = new TypingSample2();
                    window.frmTypesample.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * Create the application.
     */
    public TypingSample2() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */

    private void initialize() {
        frmTypesample = new JFrame();
        frmTypesample.setTitle("TypingSample2");
        frmTypesample.setBounds(100, 100, 561, 191);
        frmTypesample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmTypesample.getContentPane().setLayout(null);

        JLabel Label = new JLabel("Enterを押すとはじまります");
        Label.setFont(new Font("MS UI Gothic", Font.PLAIN,20));
        Label.setBounds(34, 30, 331, 43);
        frmTypesample.getContentPane().add(Label);

        JTextField textField = new JTextField();
        textField.setFont(new Font("M113, 24", Font.PLAIN, 20));
        textField.setBounds(34, 83, 483, 52);
        frmTypesample.getContentPane().add(textField);
        textField.addKeyListener(new Keyboard_input());

        textField.addActionListener(
                new ActionListener(){
                  public void actionPerformed(ActionEvent e){
                      Label.setText("");
                      Label.setText(pristr[r]);

                      textField.setText("");
                      count++;
                      if(count == 20){  

                          System.out.println("-----------------------------result-----------------------------");
                          for(int i=65;i<=90;i++){
                              System.out.println("["+ i + "]:Time=" + avTime[i]);
                              System.out.println("Count=" + c[i]);
                          }
                          System.exit(0);
                       }
                    r++;


                    /* 処理したい内容をここに記述する */
                  }
                }
              );
    }

    class Keyboard_input implements KeyListener
    {
      public void keyPressed(KeyEvent event)
     {

         /* int KeyCode = event.getKeyCode();

          ptime = System.currentTimeMillis();
          if(KeyCode==35){
              System.out.println("-----------------------------result-----------------------------");
              for(int i=65;i<=90;i++){
                  System.out.println("[" + i + "]:" + avTime[i]);
              }
              System.exit(0);
          }

     */}
         public void keyTyped(KeyEvent event)
         {
             //何もしない
        }

     public void keyReleased(KeyEvent event)
     {

        userstr = textField.getText();
        /*System.out.println(userstr);
         int length=0;
         length=userstr.length();
         System.out.println(length);
        if(length >= 2){
             String firstkeystr = userstr.substring(length-2);
             String secondkeystr = userstr.substring(length-1);
             firstkey = Integer.parseInt(firstkeystr);
             secondkey = Integer.parseInt(secondkeystr);

             System.out.println("firstkey="+firstkey);
             System.out.println("secondkey="+secondkey);

    }
     }
    */}

}


TextFieldにキーを入力するとそのキーを離したときに入力したキーとその前に入力されたキーのkeycodeを取得したいのですが、eclipseで記述時には実行はされるのですが、実際にTextFieldに入力すると
userstr = textField.getText();の部分でException in thread "AWT-EventQueue-0" java.lang.NullPointerExceptionエラーを吐かれてしまいます。
原因はなんなのでしょうか?
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

Keyboard_input のなかでtextFieldはNullだからですね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/18 14:34

    ご回答ありがとうございます。
    textFieldを反映させるにはどのようにすれば良いのでしょうか?

    キャンセル

  • 2016/10/18 14:54

    そもそもtextFieldは二つあるし、

    public TextComponent textField;
    JTextField textField = new JTextField();

    「反映」が何を指しているかもわかりませんが、
    JTextFieldでKeyEventが発生したときにKeyboard_inputクラスのメソッドが動作できるようになるのであって、JTextFieldの情報がリスナー側に伝わるわけではないですよ。

    キャンセル

0

質問者さんへアドバイスした方がよいと思える点があります。おそらくTypingSample2のフィールド

public TextComponent textField;

は、内部クラスKeyboard_inputを定義した際にコンパイルエラーになったからとりあえず定義したとか、そんな感じではないですか? メソッドの中からフィールドや変数を参照する際にそれがどの変数・フィールドを指すのか曖昧なままコーディングされているように見受けられます。

問題のコードについてはkeyRelasedメソッドの中で参照しているフィールドに値を設定する処理がありません。というより、initializeメソッドの中で(B)はローカル変数textFieldを宣言していてそのローカル変数はフィールドとは何の関係もない変数だというところがピンときてないのだと思います。このプログラムだと、keyReleasedの中でtextFieldを参照したいならクラスのフィールドとして宣言しておかないといけません。ゆえにJTextFieldのインスタンスをnewで生成した際にそれをローカル変数へ設定するのではなくフィールドに設定するように直せばよいです。

public class TypingSample2 {
  ...
  public TextComponent textField; <== (A)フィールドの宣言
  ...
  private void initialize() {
    ...
    JTextField textField = new JTextField(); <= (B)ローカル変数の宣言とそれへの設定
    ...
  }

  class Keyboard_input implements KeyListener {
    ...
    @Override public void keyReleased(KeyEvent ev) {
      textField.getText(); <==このtextFieldは(A)の参照です。
    }
  }
}

===> 修正方法はinitializedメソッドの中身を変更
  JTextField textField = new JTextField(); <= (B)ローカル変数の宣言とそれへの設定
  =>
  textFiled = next JTextField(); <= (A)フィールドへの設定

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る