GUI版三択問題

三択問題をクリックで

以前キーボードから答えた三択問題をマウスで答えるようにします。

三択問題2問目になったところ

問題は同じ形式のファイル

問題のデータは前と同じものを使います。

すでにあるものが4問以上ないときには増やしてください。もう一度形式を書きます。強調されている部分は直接入力(半角)でいれます。QAは大文字でなければなりません。"."(ドット)も忘れずに入れます。これはプログラムをこのような形式を読むように設計しているからです。問題は自分で考えてください。

ファイル名 mondai.txt (すでにあるはず)

Q.クラスの中に書かれるものはフィールド、コンストラクタ、もうひとつは?

1.メソッド
2.インスタンス
3.コンスタンス
A.1

Q.例外処理でtryとともに用いられるものは?
1.error
2.while
3.catch

A.3

Q.が行頭にある行は問題、1.2.3.が行頭にあるのは選択肢、A.が行頭にあるのは正解の番号を表しています。これ以外の文字で始まる行は無視されます。

クラスも流用する

プログラムも一部をそのまま使います。

前回の構成

Toi.java (コンパイルだけ)
Mondaishuu.java (コンパイルだけ)
Mondai.java (コンパイルして実行)

今回の構成

Toi.java (コンパイルだけ)
Mondaishuu.java (コンパイルだけ)
SanTaku.java (コンパイルして実行)

なにせ,1行だけで問題集のデータが使えるようになるのですから,使わない手はありません。

Mondaishuu m = new Mondaishuu("mondai.txt",10 );

ファイル名 SanTaku.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SanTaku extends JFrame implements ActionListener{
    /*フィールド*/
    JButton button1;
    JButton button2;
    JButton button3;
    JButton endBttn;
    JLabel label1;
    JLabel label2;
    JTextArea text;
    int n = 0;
    Mondaishuu m;
    
    /* コンストラクタ*/
    public SanTaku(){
        setDefaultCloseOperation(EXIT_ON_CLOSE); //終了処理を追加
        m   = new Mondaishuu("mondai.txt",10 );
        label1 = new JLabel("問題 "+ (n+1), JLabel.LEFT); //nは0から問題番号は1から
        text =  new JTextArea(m.toi[n].question,4,20); //4行10文字
        button1 = new JButton(m.toi[n].ans1);
        button2 = new JButton(m.toi[n].ans2);
        button3 = new JButton(m.toi[n].ans3);
        label2 = new JLabel("問題数 "+m.mondaisu,JLabel.LEFT);
        endBttn = new JButton("終了");

        /*部品内の文字の配置*/
        button1.setHorizontalAlignment(SwingConstants.LEFT);
        button2.setHorizontalAlignment(SwingConstants.LEFT);
        button3.setHorizontalAlignment(SwingConstants.LEFT);
        text.setLineWrap(true);  //自動的に改行するように
        
        /*配置*/
        GridBagLayout gridbag = new GridBagLayout();
        setLayout(gridbag);
        add(label1);
        add(text);
        add(button1);
        add(button2);
        add(button3);
        add(label2);
        add(endBttn);

        GridBagConstraints c = new GridBagConstraints();  //制限・束縛
        c.insets = new Insets(5, 10, 5, 10); //各コンポーネントの周り
        c.gridx = 0 ;    //横位置
        //c.gridy = GridBagConstraints.RELATIVE; //デフォルト値
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.fill = GridBagConstraints.BOTH;
        gridbag.setConstraints(label1, c);
        gridbag.setConstraints(text, c);
        gridbag.setConstraints(button1, c);
        gridbag.setConstraints(button2, c);
        gridbag.setConstraints(button3, c);
        gridbag.setConstraints(label2, c);
        c.fill = GridBagConstraints.VERTICAL;
        gridbag.setConstraints(endBttn, c);
        
        /*イベント監視*/
        button1.addActionListener(this);
        button2.addActionListener(this);
        button3.addActionListener(this);
        endBttn.addActionListener(this);
        pack();
        setVisible(true);
    }
    /* イベントがあったらここに来る */
    public void actionPerformed(ActionEvent e) {
        String seikai = "";
        //終了ボタンだったら即終了
        if (e.getSource() == endBttn) {
           System.exit(0);
        }
        //nの値が大きいと正解のチェックがエラーになるので。
        if (n < m.mondaisu) {
            if (e.getSource() == button1) {
               seikai = m.check(n,1);
            }
            else if (e.getSource() == button2) {
               seikai = m.check(n,2);
            }
            else if (e.getSource() == button3) {
               seikai = m.check(n,3);
            }
        }
        //JButton以外でイベントはないはずだが、念のため
        //seiaiの初期値""が変わっていないとボタン1~3は押されていない
        if ( seikai != "" ){
            label2.setText("問題 "+ (n+1) + " " + seikai 
                         + "  正解数:" + m.seikaict +"/"+ (n+1));
            n++;
            //最終問題でなければ次の問題を用意する
            if ( n < m.mondaisu ){
                label1.setText("問題 "+ (n+1));
                text.setText(m.toi[n].question);
                button1.setText(m.toi[n].ans1);
                button2.setText(m.toi[n].ans2);
                button3.setText(m.toi[n].ans3);
                pack();
            }
            //最終問題なら、採点をする。
            else{
                text.setText("正解数:" + m.seikaict + "\n"
                           + "誤答数:" + m.gotouct  + "\n"
                           + "正解率:" + 100.0*m.seikaict/(m.seikaict+m.gotouct)
                           + "%");
                label2.setText(" ");
                button1.setText(" ");
                button2.setText(" ");
                button3.setText(" ");
            }
        }
    }
    /********* main **********/
    public static void main(String[] args){
        /* フレームを作成(事実上のプログラム実行) */
        SanTaku frame1 = new SanTaku();
    }
}

Mondaishuuクラスの復習

Mondaishuu クラスのインスタンス m を作ると,

Mondaishuu m   = new Mondaishuu("mondai.txt",10 );

次のようにして問題文と3つの選択肢が得られます。

m.toi[n].question   //Mondaishuu m の中の n番の 問題文
m.toi[n].ans1     //その答えの1番目の選択肢

JTextArea

JTextAreaは複数行になる文字列を扱うための部品です。この例では,4行10文字の領域を確保しています。

text =  new JTextArea(m.toi[n].question,4,10);

課題

1.

上記SanTaku.javaをつくり、実行してみなさい

ファイル名 SanTaku.java

2.

mondai.txt に問題が4つ以上なければ自作して4つ以上にしなさい。

ファイル名 mondai.txt

3.

SanTaku.javaは m.toi[n].question などが2カ所にあるなど、まだ無駄が多く、またわかりにくい。

改良型、SanTaku2.java を作ってみなさい。最初のコメント文で(/*......*/)どのような改良かを書くこと。

ファイル名 SanTaku2.java

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified