try { Thread.sleep(2000); } catch (InterruptedException e) {}
上の文を使って 2秒 時間を止めて
ボタンに「正解!」「まちがっているよ!」を
表示させたい。
しかし、ボタンに「正解」等を表示する前に、
時間が止まってしまうんだな。
どの位置に Thread.sleep() を持ってきても 「◯」「×」しか表示されない。
(実際には 表示されるんだけど、すぐに上書きされてしまう。)
(画像は ◯ × の 書き換えを // で無効にしたもの)
忘備録として、
このプログラムは 3つのclassに分かれている。
(将来的には 問題表示と 正誤判定の部分を別クラスにしたい)
"main"起動クラス、"MyWindow"動作開始、"WinListener"終了
MyWindow クラスのメソッドの流れは、
MyWindow() "AWTの表示"
↓
questions() "MyWindow() 内にて呼び出される 問題の作成 Stringにして返す"
↓
actionPerformed(ActionEvent e) "ボタンの判定"
↓
judgment() "actionPerformed(ActionEvent e) 内にて呼び出される
クラス変数を元に booleanにして返す"
countCalculation() "actionPerformed(ActionEvent e) 内にて呼び出される
クラス変数を元に 出題回数をカウント"
↓
questions()
この countCalculation() 内で Thread.sleep() を使い
「正解!」等を 2秒間表示したいんだけど 何故か
ここで止められない。
⭐️2秒 止まるは止まるけれど。。。
//◯間違いを作ろう(あまり)
//◯間違いを作ろう(商)
//◯5回出題させてみよう
//表示の不具合を治す。
import java.awt.*;
import java.awt.event.*;
class Times4{
public static void main(String[] args){
MyWindow mw = new MyWindow();
}
}
class MyWindow extends Frame implements ActionListener{
Label la;
Button btn1, btn2;
int moto; //割られる数値です。
int waru; //割る数値です。
int ans; //答え
int amari; //答え(あまり)
static int count = 1;
static int seikai;
MyWindow(){
setTitle("問題集");
setSize(640, 400);
setLayout(null); //レイアウトの解除
btn1 = new Button("◯");
btn2 = new Button("×");
btn1.setBounds(100, 300, 150, 80);
btn2.setBounds(400, 300, 150, 80);
btn1.addActionListener(this);
btn2.addActionListener(this);
add(btn1);
add(btn2);
la = new Label( questions() );
la.setFont(new Font("Serif", Font.PLAIN, 34));
la.setAlignment(Label.CENTER);
la.setBackground(Color.LIGHT_GRAY); //Label 背景色
la.setForeground(Color.BLACK); //Label 文字色
la.setBounds(100, 100, 450, 50);
add(la);
setVisible(true);
addWindowListener( new WinListener() );
}
public String questions(){
waru = (int)(Math.random()*29)+2; //割る数値(2〜30)
ans = (int)(Math.random()*9)+1; //答え(1〜9)
amari = (int)(Math.random()*(waru-1))+1; //あまりの数値(1〜割る数値−1)
moto = waru * ans + amari; //割られる数値
System.out.println(moto + " ÷ " + waru + " = " + ans + " ... " + amari);//験算用
btn1.setLabel("◯");
btn2.setLabel("×");
int ran1 = (int)(Math.random()*2); //間違いの発生 確率50% ただし 変数に0を加算する事もある。
if(ran1 == 0){
int ran2 = (int)(Math.random()*3);
if(ran2 == 0){
int falseAmari = (int)(Math.random()*3);
falseAmari -= 1;
amari = amari + falseAmari; // あまりに -1,0,1 を加算
}
else{
int falsewaru = (int)(Math.random()*2);
ans = ans + falsewaru; // 商に 0,1 を加算
}
}
return moto + " ÷ " + waru + " = " + ans + " ... " + amari;
}
public boolean judgment(){
return moto/waru==ans && moto%waru==amari; //答えと 余りの判定。booleanにて返す。
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == btn1) {
if(judgment() == true){
btn1.setLabel("正解 !");
countCalculation();
}
else{
btn1.setLabel("違っているよ !");
countCalculation();
}
}
if(e.getSource() == btn2) {
if(judgment() == false){
btn2.setLabel("正解 !");
countCalculation();
}
else{
btn2.setLabel("違っているよ !");
countCalculation();
}
}
}
public void countCalculation(){
try { Thread.sleep(2000); } catch (InterruptedException e) {} // 2秒間だけ処理を止める
System.out.println(count + "回目"); //試験用
count++;
if(count <= 5){ //5回で終了。
la.setText( questions() ); //ラベルの表示の書き換え questions() メソッドへ
}
else{
System.out.println("お疲れ様でした。");
}
}
}
class WinListener extends WindowAdapter{
public void windowClosing(WindowEvent e){System.exit(0);}
}
あれこれ、原因を考えるより ラベルをもう1つ作り、
そこに「正解!」等を表示した方が早いのではないか。。。
今日の教訓
あれこれ 壁にぶち当たってるな〜
0 件のコメント:
コメントを投稿