ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのjavaのイベントについての質問です

  • mixiチェック
  • このエントリーをはてなブックマークに追加
以前、ほかのコミュで質問したものですが
レスが無かったのものでこちらでお願いいたします。

イベントリスナーとアクションを使うプログラミングで
行き詰ってしまいました、、
掛け算の答えを当てるプログラミングで
はじめにステータスバーに問題を出したいのですが
答えた後に問題が出てしまいます、、
最初に問題を出しておくにはどうしたら良いのでしょうか?

下記プログラム
*********************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Graphics;

public class MathQuizApplet extends JApplet implements ActionListener{
private TextField answerField;
private Button btn;
private int value1, value2, correct, answerInt, answer;

public void init() {
Label label = new Label("answer");
answerField = new TextField();
btn = new Button("ok");

label.setBounds(40,20,50,20);
answerField.setBounds(100,20,60,20);
btn.setBounds(70,50,50,20);

this.setLayout(null);
this.add(label);
this.add(answerField);
this.add(btn);
btn.addActionListener(this);
}

public int Quiz(){
value1 = 1 + (int)(Math.random() * 9);
value2 = 1 + (int)(Math.random() * 9);
super.showStatus("How much is "+value1+"*"+value2+"?");
correct = value1 * value2;
return correct;
}

public void actionPerformed(ActionEvent e){
correct = Quiz();
String answerS = answerField.getText();
answer = Integer.parseInt(answerS);
repaint();
}

public void paint(Graphics g){
super.paint(g);
if (correct == answer){
answerInt = 1 + (int)(Math.random() * 4);
switch (answerInt){
case 1:
g.drawString("very good!", 100, 100); break;
case 2:
g.drawString("Excellent!", 100, 100); break;
case 3:
g.drawString("Nice work!" , 100, 100); break;
case 4:
g.drawString("Keepup the good work!", 100, 100); break;
default: ;
}
}
else{
answerInt = 1 + (int)(Math.random() * 4);
switch (answerInt){
case 1:
g.drawString("No. Please try again.", 100, 100); break;
case 2:
g.drawString("Wrong. Try once more.", 100, 100); break;
case 3:
g.drawString("Don't give up!", 100, 100); break;
case 4:
g.drawString("No. Keep trying.", 100, 100); break;
default: ;
}
}
}
}
**************

javaを始めて浅いもので間違いだらけかと思いますが
ご教授よろしくお願いします!

コメント(14)

Quiz()で問題の作成と表示をしてるんですよね?
アプレットの起動直後に表示したいのであれば、
init()に書くべきではないでしょうか?
ゆ〜ゆ〜さん
返信ありがとうございます!
質問なのですが
>init()に書く
とはpublic void actionPerformed(ActionEvent e)の
中のcorrect = Quiz(); のことですか?
それともQuiz()メソッドの中身をinit()に書き込み
Quiz()メソッドは省くと言う事ですか?
初心者なものでこの質問自体がおかしいかもしれませんが
どうぞよろしくお願いします!
追伸
一応correct = Quiz(); をinit()に書いてみたり
Quiz()をメソッドなくし
value1 = 1 + (int)(Math.random() * 9);
value2 = 1 + (int)(Math.random() * 9);
super.showStatus("How much is "+value1+"*"+value2+"?");
correct = value1 * value2;
をinit()に書いたりしましたが
この場合、今度はステータスバーに何も表示されなくなりました
どのように直したらよいのか全くわかりません、、
どうぞよろしくお願いします!
1)Quizメソッドからsuper.showStatus("How much is...");を消す
2)paintメソッドの最後にsuper.showStatus("How much is ...");を書く
で出ました。

■細かい突っ込み
・メソッド名は最初小文字から始めるので、Quizメソッドの名前はquizにするのがJavaのお作法に従ってます。

・今のつくりならquizメソッドに戻り値はいりません。
quizメソッド内でcorrectフィールドに値を設定してreturn
呼び出し側でcorrectフィールドにquizの戻り値を代入
無駄っぽくないですか?

・色々やってるうちにおかしくなったのかもしれませんが、今の状態だと意図した通りには動いてないと思います。
かずきちさん
返信ありがとうございます!
メソッドの始まりは小文字でしたね
忘れてみました、すみません、、
>quizメソッドに戻り値はいりません
こちらも確かにそうでした、、
correct = value1 * value2;
としているので
以前にquizメソッドさえ実行していれば
変数correctには答えの値が入ってるって事ですよね?
以上のことを踏まえ1)と2)を実行し
以下のプログラムを作ってみました。
-------
import java.awt.Graphics;

public class MathQuizApplet extends JApplet implements ActionListener{
private TextField answerField;
private Button btn;
private int value1, value2, correct, answerInt, answer;

public void init() {
Label label = new Label("answer");
answerField = new TextField();
btn = new Button("ok");

label.setBounds(40,20,50,20);
answerField.setBounds(100,20,60,20);
btn.setBounds(70,50,50,20);

this.setLayout(null);
this.add(label);
this.add(answerField);
this.add(btn);
btn.addActionListener(this);
quiz();
}

public void quiz(){
value1 = 1 + (int)(Math.random() * 9);
value2 = 1 + (int)(Math.random() * 9);
correct = value1 * value2;
}

public void actionPerformed(ActionEvent e){
String answerS = answerField.getText();
answer = Integer.parseInt(answerS);
repaint();
}

public void paint(Graphics g){
super.paint(g);
if (correct == answer){
answerInt = 1 + (int)(Math.random() * 4);
switch (answerInt){
case 1:
g.drawString("very good!", 100, 100); break;
case 2:.
g.drawString("Excellent!", 100, 100); break;
case 3:
g.drawString("Nice work!" , 100, 100); break;
case 4:
g.drawString("Keepup the good work!", 100, 100); break;
default: ;
}
}
else{
answerInt = 1 + (int)(Math.random() * 4);
switch (answerInt){
case 1:
g.drawString("No. Please try again.", 100, 100); break;
case 2:
g.drawString("Wrong. Try once more.", 100, 100); break;
case 3:
g.drawString("Don't give up!", 100, 100); break;
case 4:
g.drawString("No. Keep trying.", 100, 100); break;
default: ;
}
}
super.showStatus("How much is "+value1+"*"+value2+"?");
}
}
------------------------------

始めに問題を出すこと出来ました。

しかしアプレットを立ち上げたときから
その回答が当たってたかどうかという
switch構文の中のg.drawStringの文字列が
出てしまいます。
これを直すにはどのようにしたら良いのでしょうか?

そしてできたら問題が正解したら次の問題を
間違っていたら同じ問題を出したいです。

どうぞよろしくお願いします!
〓あちゅや(aCHUya)さん
紛らわしいタイトルつけちゃって
すみませんでしたー、、
paintメソッド中で答えが当たっているかどうかの判断をしているのが間違いの元でしょう。
簡単に書き直すのであれば、
quiz()で問題を生成して
actionPerformed()中で結果判定と表示用文字列の生成を行う
というような、方法がいいのではないでしょうか?

import java.awt.Button;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;

public class MathQuizApplet extends JApplet implements ActionListener {
private TextField answerField;

private Button btn;

private int value1, value2, correct, answerInt, answer;

private String replyString = "";

private String questionString = "";

public void init() {
Label label = new Label("answer");
answerField = new TextField();
btn = new Button("ok");

label.setBounds(40, 20, 50, 20);
answerField.setBounds(100, 20, 60, 20);
btn.setBounds(70, 50, 50, 20);

this.setLayout(null);
this.add(label);
this.add(answerField);
this.add(btn);
btn.addActionListener(this);

quiz();
}

public void quiz() {
value1 = 1 + (int) (Math.random() * 9);
value2 = 1 + (int) (Math.random() * 9);
correct = value1 * value2;

questionString = "How much is " + value1 + "*" + value2 + "?";
}

public void actionPerformed(ActionEvent e) {
String answerS = answerField.getText();
answer = Integer.parseInt(answerS);

if (correct == answer) {
answerInt = 1 + (int) (Math.random() * 4);
switch (answerInt) {
case 1:
replyString = "very good!";
break;
case 2:
replyString = "Excellent!";
break;
case 3:
replyString = "Nice work!";
break;
case 4:
replyString = "Keep up the good work!";
break;
default:
break;
}

quiz(); //新しい問題を出題

} else {
answerInt = 1 + (int) (Math.random() * 4);
switch (answerInt) {
case 1:
replyString = "No. Please try again.";
break;
case 2:
replyString = "Wrong. Try once more.";
break;
case 3:
replyString = "Don't give up!";
break;
case 4:
replyString = "No. Keep trying.";
break;
default:
break;
}
}

repaint();
}

public void paint(Graphics g) {
super.paint(g);

super.showStatus(questionString);

g.drawString(replyString, 100, 100);

}
}
しのぶさん
返信ありがとうございます!
思ったように実行すること出来ました!
質問があるのですが
これはわたしがオブジェクト指向というものを
まだ理解できていないのかもしれませんが
paint()メソッドは、起動時に init(), start() に
続いて自動的に実行されると思うのですが
最初の時点ではinit()のなかでquiz()を実行してるので
paint()メソッドの中の
super.showStatus(questionString);
で問題が表示され
g.drawString(replyString, 100, 100);
ではreplyStringがまだ空なので何も表示されず
次にアクションイベントの中で
replyString、questionString、両方の変数に
文字列が代入されてrepaint()メソッドで出力する
という理解であっているのでしょうか?
そうですね。
その理解で大丈夫ではないでしょうか?

正確に言えばpaint()メソッドは描画が必要になったときに呼ばれます。例えば、上に別のウィンドウを重ねてそれをどけた場合などです。起動時も必要なので呼ばれるというわけです。

それを明示的に呼ぶためのメソッドがrepaint()です。
コメントが遅くなってすみません。
ですが、私が見ていない間に、
他の方が解決に導いてくださっているようで良かったです。(^-^)
しのぶさん
了解しました!
javaの謎が少し解けてすっきりしました^^
本当にありがとうございました!!

ゆ〜ゆ〜さん
気にしてくださってありがとうございます!
解決できて良かったです^^

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。