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

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

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

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

Q&A

1回答

2309閲覧

keycodeとローマ字入力のエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2016/09/12 06:40

編集2022/01/12 10:55

Javaで各アルファベットの毎のキー入力の時間の平均(押してから離すまで)を計測するアプリケーションをeclipseとSWINGデザイナーで作成しています。
TextFieldに文字を打ち込んでもらい、endキーを押すとそれまでの各キーの平均打鍵計測時間が表示される仕組みです。
半角のアルファベット入力での計測は問題なく出来たのですがカタカナ・ひらがな
ローマ字キーや半角/全角漢字キーを用いて日本語入力を行おうとすると下記のエラーが出てきてしまい計測秒数も明らかに巨大な数字が出てきてしまいます。
日本語入力でも問題なく計測したいのですがどのようにすればよろしいでしょうか?
ご回答お待ちしております。

java

1package pack; 2 3import java.awt.EventQueue; 4import java.awt.Font; 5import java.awt.TextComponent; 6import java.awt.event.ActionEvent; 7import java.awt.event.ActionListener; 8import java.awt.event.KeyEvent; 9import java.awt.event.KeyListener; 10import java.util.Random; 11 12import javax.swing.JFrame; 13import javax.swing.JLabel; 14import javax.swing.JTextField; 15 16public class TypingSample { 17 18 private JFrame frmTypesample; 19 long ptime; 20 long rtime; 21 long[] time = new long[99]; 22 long[] c = new long [99]; 23 String userstr; 24 public TextComponent textField; 25 /** 26 * Launch the application. 27 */ 28 public static void main(String[] args) { 29 EventQueue.invokeLater(new Runnable() { 30 public void run() { 31 try { 32 TypingSample window = new TypingSample(); 33 window.frmTypesample.setVisible(true); 34 } catch (Exception e) { 35 e.printStackTrace(); 36 } 37 } 38 }); 39 } 40 41 /** 42 * Create the application. 43 */ 44 public TypingSample() { 45 initialize(); 46 } 47 48 /** 49 * Initialize the contents of the frame. 50 */ 51 52 private void initialize() { 53 frmTypesample = new JFrame(); 54 frmTypesample.setTitle("TypingSample"); 55 frmTypesample.setBounds(100, 100, 567, 657); 56 frmTypesample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 57 frmTypesample.getContentPane().setLayout(null); 58 59 JLabel Label2 = new JLabel(); 60 Label2.setFont(new Font("MS UI Gothic", Font.PLAIN,40)); 61 Label2.setBounds(90, 504, 376, 33); 62 frmTypesample.getContentPane().add(Label2); 63 64 JTextField textField = new JTextField(); 65 textField.setFont(new Font("MS ゴシック", Font.PLAIN, 40)); 66 textField.setBounds(27, 291, 483, 203); 67 frmTypesample.getContentPane().add(textField); 68 textField.addKeyListener(new Keyboard_input()); 69 70 71 textField.addActionListener( 72 new ActionListener(){ 73 public void actionPerformed(ActionEvent e){ 74 Label2.setText(""); 75 userstr = textField.getText(); 76 Label2.setText(userstr); 77 textField.setText(""); 78 /* 処理したい内容をここに記述する */ 79 } 80 } 81 ); 82 83 84 85 86 } 87 88 class Keyboard_input implements KeyListener 89 { 90 public void keyPressed(KeyEvent event) 91 { 92 int KeyCode = event.getKeyCode(); 93 ptime = System.currentTimeMillis(); 94 if(KeyCode==35){ 95 for(int i=65;i<=90;i++){ 96 System.out.println(i + ":" + time[i]); 97 } 98 } 99 100 } 101 102 103 public void keyReleased(KeyEvent event) 104 { 105 rtime = System.currentTimeMillis() - ptime; 106 int KeyCode = event.getKeyCode(); 107 108 c[KeyCode]++; 109 110 time[KeyCode] =(time[KeyCode]+rtime) / c[KeyCode]; 111 System.out.println("[" + KeyCode + "」Released. Time:"+ rtime); 112 System.out.println("AVTime:"+time[KeyCode]); 113 } 114 115 116 public void keyTyped(KeyEvent event) 117 { 118 } 119 } 120 121 } 122` 123 124###発生している問題・エラーメッセージ 125Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 240 126 at pack.TypingSample$Keyboard_input.keyReleased(TypingSample.java:118) 127 at java.awt.Component.processKeyEvent(Component.java:6494) 128 at javax.swing.JComponent.processKeyEvent(JComponent.java:2832) 129 at java.awt.Component.processEvent(Component.java:6310) 130 at java.awt.Container.processEvent(Container.java:2236) 131 at java.awt.Component.dispatchEventImpl(Component.java:4889) 132 at java.awt.Container.dispatchEventImpl(Container.java:2294) 133 at java.awt.Component.dispatchEvent(Component.java:4711) 134 at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954) 135 at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806) 136 at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074) 137 at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945) 138 at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771) 139 at java.awt.Component.dispatchEventImpl(Component.java:4760) 140 at java.awt.Container.dispatchEventImpl(Container.java:2294) 141 at java.awt.Window.dispatchEventImpl(Window.java:2746) 142 at java.awt.Component.dispatchEvent(Component.java:4711) 143 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 144 at java.awt.EventQueue.access$500(EventQueue.java:97) 145 at java.awt.EventQueue$3.run(EventQueue.java:709) 146 at java.awt.EventQueue$3.run(EventQueue.java:703) 147 at java.security.AccessController.doPrivileged(Native Method) 148 at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 149 at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 150 at java.awt.EventQueue$4.run(EventQueue.java:731) 151 at java.awt.EventQueue$4.run(EventQueue.java:729) 152 at java.security.AccessController.doPrivileged(Native Method) 153 at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 154 at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 155 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 156 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 157 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 158 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 159 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 160 at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 161[65Released. Time:16127 162AVTime:3235 163[73Released. Time:16335 164AVTime:2727 165[85Released. Time:16607 166AVTime:3330 167[69Released. Time:16847 168AVTime:3376 169[79Released. Time:17248 170AVTime:3458 171[10Released. Time:17568 172AVTime:8815 173 174 175

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

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

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

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

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

guest

回答1

0

以下で配列を99個用意してますが、

// 定義の箇所 long[] time = new long[99]; long[] c = new long[99];

押されたキーのキーコードが要素番号を超えるとエラーになります。
ArrayIndexOutOfBoundsException
「^」だとキーコード514でエラーになりました。

配列の長さを大きくするか、HashMap<Integer, Integer>を使えば大丈夫だと思います。
KeyEvent#getKeyCodeが返す値の範囲が分かればよいのですが、調べてもわかりませんでした。

投稿2016/09/12 07:04

java-beginner

総合スコア452

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

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

退会済みユーザー

退会済みユーザー

2016/09/12 08:37

ありがとうございます。半角キーのkeycodeが三ケタの数字だった為おそらくエラーが出ていたのだと思います。 少し調べた所、keyPressメソッドは全角の入力では呼び出されなく、keyTypedメソッドが呼び出されるとの事だったのですが、コードを変えてみた所入力時には呼び出されず、エンターで文字数が確定したとき、文字数分だけ呼び出されました。 キーが押されたときに呼び出されるようにしたいのですがどのようにすれば良いかお判りでしょうか?
java-beginner

2016/09/12 08:51

「keyPressメソッドは全角の入力では呼び出されなく」とのことですが、以下の検証をしました。 Windows 10でEclipse Marsなのですが、 配列の定義を以下にして「半角入力」->「あいうえお」->「Enterで確定」->「Enter」という操作をしました。 ``` long[] time = new long[245]; long[] c = new long[245]; ``` 以下がコンソールログです。 ``` [244」Released. Time:1473669699797 AVTime:1473669699797 [65」Released. Time:1473669700998 AVTime:1473669700998 [73」Released. Time:1473669702419 AVTime:1473669702419 [85」Released. Time:1473669703133 AVTime:1473669703133 [69」Released. Time:1473669703546 AVTime:1473669703546 [79」Released. Time:1473669703817 AVTime:1473669703817 [10」Released. Time:1473669704310 AVTime:1473669704310 [10」Released. Time:50 AVTime:736834852180 ``` 細かい部分はわからないのですが、上記出力は想定外なのでしょうか? 全角入力でもキー入力ごとにkeyReleasedが呼び出されています。 以下のページによるとキーに関係なく、KEY_PRESSED、KEY_TYPED、KEY_RELEASEDと記載があります。 https://docs.oracle.com/javase/jp/8/docs/api/java/awt/event/KeyEvent.html
退会済みユーザー

退会済みユーザー

2016/09/12 10:01

半角英数字の場合 [65」Released. Time:95 AVTime:95 [73」Released. Time:96 AVTime:96 [85」Released. Time:96 AVTime:96 [69」Released. Time:64 AVTime:64 [79」Released. Time:80 AVTime:80 [10」Released. Time:48 AVTime:48 のような結果になるのでこれが本来取得したい値です。 全角入力の場合、pressメソッドとtypedメソッドが呼び出されないkeyReleasedのみ呼び出されてしまい、単純に現在の時刻がミリ秒で表示されているだけになってしまっているみたいです。 おとなしく半角文字で取得するようにしてみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問