🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

1回答

589閲覧

入力が進まないです。

nubba

総合スコア16

Java

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

1グッド

0クリップ

投稿2019/12/09 07:21

前提・実現したいこと

最初の画面でeasyもしくはhardを押してタイピングゲームが始まるようにしたいです。
easyの場合は5回、hardの場合は10回タイピングできるようにしたいです。

今最初の画面で上に残り単語、真ん中にタイピングの文字、下にはeasyとhardのボタンを配置はできているのですが、easyまたはhardを押した場合easyなら5、hardなら10を返してタイピングプログラムを回したいのですがそのやり方がよくわかりません。どのようにすればeasyまたはhardボタンを押した際に正しく動作するのか教えてほしいです。

発生している問題・エラーメッセージ

エラーメッセージ
package ex09; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Keytamesi2 extends JFrame implements ActionListener{ private static final String[] StrArray = null; JLabel jl,jl1; JPanel pane1=new JPanel(); JButton[] jb=new JButton[2]; int miss=0; int clearnum = 0; int clear=0; public static void main(String[] args) { new Keytamesi2(); int i=0; String[] StrArray = new String[1000];// try { File file = new File("C://java//words.txt"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); // String lineStr;//1行分代入変数 String lineStr;// テキストファイルの文字を配列に入れたい i=0; while((lineStr=br.readLine())!=null) { System.out.println(lineStr); StrArray[i]=lineStr; i=i+1; } br.close(); }catch(IOException e) { e.printStackTrace(); } } Keytamesi2(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(500,400); this.setTitle("KeyTyping2"); setstartLabel(); setJButton(); } void setstartLabel(){ jl = new JLabel("タイピング"); jl.setFont(new Font(null,Font.PLAIN,40)); jl.setHorizontalAlignment(JLabel.CENTER); jl.setForeground(Color.BLUE); jl.setOpaque(true); this.getContentPane().add(BorderLayout.CENTER,jl); System.out.println(jl.getText().length()); this.setVisible(true); jl1 = new JLabel("残り単語"); jl1.setFont(new Font(null,Font.PLAIN,20)); jl1.setHorizontalAlignment(JLabel.CENTER); jl1.setForeground(Color.BLACK); this.getContentPane().add(BorderLayout.NORTH,jl1); System.out.println(jl1.getText().length()); this.setVisible(true); } void setJButton(){ pane1.setLayout(new GridLayout(1,2)); this.getContentPane().add(BorderLayout.SOUTH,pane1); jb[0]=new JButton("easy"); pane1.add(jb[0]); jb[1]=new JButton("hard"); pane1.add(jb[1]); jb[0].addActionListener (this); jb[1].addActionListener (this); this.setVisible(true); } public void actionPerformed(ActionEvent e) { // TODO 自動生成されたメソッド・スタブ if(e.getSource()==jb[0]) { //EasyMode(); clear=5; }else if(e.getSource()==jb[1]) { //HardMode(); clear=10; } } // void EasyMode() { // // //easyボタン押された後の動作 // //ランダムで5回出したい。 // int clear=5; // return // // } // void HardMode() { // // //10回 // int clear=10; // return // // } String Random() { Random ran = new Random(); int num = ran.nextInt(StrArray.length); return StrArray[num]; } public void keyTyped(KeyEvent e) { String str = jl.getText(); System.out.println(e.getKeyChar()); char ch = e.getKeyChar(); if(str.charAt(0) == ch) { jl.setForeground(Color.BLUE); str = (str.substring(1)); if(str.length() == 0) { str = Random(); clearnum++; } if(clearnum == clear) { jl.setText("ミスタイプは"+ miss +"回でした"); }else { jl.setText(str); } }else { jl.setForeground(Color.RED); miss++; } } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

TN8001👍を押しています

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

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

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

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

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

m.ts10806

2019/12/09 07:23

もっと短いコードで試してみては
nubba

2019/12/09 07:25

無駄が多いということですね... 見直してみます!
m.ts10806

2019/12/09 07:29

ということではなく もっと単純な小さいコードから作って組み合わせていくべきという話です。 要件や動作の流れを細分化して切り取ってミニマムプログラムで試していくということです。 「どこまでできているのか」全容が把握しやすくなります。 「とりあえず全部一気に作ってみたけどわけわからん」と丸投げしてるようにも見えたので。
guest

回答1

0

ベストアンサー

public void keyTypedがありますが、addKeyListenerがどこにもないようです。
StrArray = new String[1000]となっていますが、words.txtは1000行はないですよね?(十分大きめに取っているのでしょうが、String Random()でnullが返りそうです)

キーボードフォーカスではまりそうなところを追加し、今やろうとしていることを動くようにしました。

Java

1package ex09; 2 3import java.awt.*; 4import java.awt.event.*; 5import java.io.File; 6import java.io.IOException; 7import java.nio.file.Files; 8import java.util.List; 9import java.util.Random; 10import javax.swing.*; 11 12public class Keytamesi2 extends JFrame implements ActionListener, KeyListener { 13 private String[] strArray; 14 private JLabel jl; 15 private JLabel jl1; 16 private JPanel pane1 = new JPanel(); 17 private JButton[] jb = new JButton[2]; 18 private int miss = 0; 19 private int clearnum = 0; 20 private int clear = 0; 21 Random ran = new Random(); 22 23 public static void main(String[] args) { 24 new Keytamesi2(); 25 } 26 27 Keytamesi2() { 28// StrArray = new String[]{ "hello", "world", "java", "swing", }; 29 try { 30 // 配列サイズを考えるのが面倒なのでリストから配列に変換 31 File file = new File("C://java//words.txt"); 32 List<String> list = Files.readAllLines(file.toPath()); 33 strArray = list.toArray(new String[0]); 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 38 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 39 this.setSize(500, 400); 40 this.setTitle("KeyTyping2"); 41 setstartLabel(); 42 setJButton(); 43 44 this.addKeyListener(this); 45 this.setFocusable(true); 46 this.setVisible(true); 47 } 48 49 private void setstartLabel() { 50 jl = new JLabel("タイピング"); 51 jl.setFont(new Font(null, Font.PLAIN, 40)); 52 jl.setHorizontalAlignment(JLabel.CENTER); 53 jl.setForeground(Color.BLUE); 54 jl.setOpaque(true); 55 this.getContentPane().add(BorderLayout.CENTER, jl); 56 57 jl1 = new JLabel("残り単語"); 58 jl1.setFont(new Font(null, Font.PLAIN, 20)); 59 jl1.setHorizontalAlignment(JLabel.CENTER); 60 jl1.setForeground(Color.BLACK); 61 this.getContentPane().add(BorderLayout.NORTH, jl1); 62 } 63 64 private void setJButton() { 65 pane1.setLayout(new GridLayout(1, 2)); 66 this.getContentPane().add(BorderLayout.SOUTH, pane1); 67 68 jb[0] = new JButton("easy"); 69 pane1.add(jb[0]); 70 jb[1] = new JButton("hard"); 71 pane1.add(jb[1]); 72 73 jb[0].addActionListener(this); 74 jb[1].addActionListener(this); 75 } 76 77 public void actionPerformed(ActionEvent e) { 78 if (e.getSource() == jb[0]) { 79 clear = 5; 80 } else if (e.getSource() == jb[1]) { 81 clear = 10; 82 } 83 84 jl.setText(Random()); 85 requestFocusInWindow(); // フォーカスをJFrameに移しKeyEventを受けれるようにする 86 } 87 88 private String Random() { 89 int num = ran.nextInt(strArray.length); 90 return strArray[num]; 91 } 92 93 public void keyTyped(KeyEvent e) { 94 String str = jl.getText(); 95 System.out.println(e.getKeyChar()); 96 char ch = e.getKeyChar(); 97 if (str.charAt(0) == ch) { 98 jl.setForeground(Color.BLUE); 99 str = (str.substring(1)); 100 101 if (str.length() == 0) { 102 str = Random(); 103 clearnum++; 104 } 105 if (clearnum == clear) { 106 jl.setText("ミスタイプは" + miss + "回でした"); 107 } else { 108 jl.setText(str); 109 } 110 } else { 111 jl.setForeground(Color.RED); 112 miss++; 113 } 114 } 115 public void keyPressed(KeyEvent e) { } 116 public void keyReleased(KeyEvent e) { } 117}

投稿2019/12/09 09:34

編集2024/03/04 10:34
TN8001

総合スコア9855

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

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

nubba

2019/12/10 03:36

ありがとうございます! 最初に残り単語と出ている場所があるのですが、easyまたはhardを押すと残り5単語と表示して一単語タイピングが終わるごとに残り4単語、残り3単語といったふうに表示したいのですがどのようにすればよいでしょうか... jl1 = new JLabel("残り"+(clear-clearnum)+"単語");で試したのですが出ませんでした...
TN8001

2019/12/10 04:06

clearが問題数(easyで5 hardで10)ですよね。 clearnumが解けた問題数ですよね。 いつ残り単語数が変わるかというと、どちらかの数値が変わったときですね。 どちらかの数値が変わったとき(clear=5;とかclearnum++;とか)に、 jl.setText("ミスタイプは" + miss + "回でした"); と同じようにjl1.setText("。。。"); と、すれば表示を変更できそうですね。 問題挑戦中にボタンを押した場合、挑戦しなおしにしたいとすると変数(miss clearnum clear)がどうなればよいのかも考えてみてください^^
nubba

2019/12/11 04:36

ありがとうございます。 わかりやすいご指導のおかげで完成しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問