では、論理演算子の練習を採点付きで行える「豪華版 GUI アプリ(Swing + プログレスバー付き)」を作りましょう。
ユーザーが問題に答えると得点が加算され、平均点がプログレスバーで視覚的に伸びていく仕様です。
機能概要
- Java Swing を使用した GUI アプリ。
- 複数の論理演算子クイズを出題。
- 各問題にラジオボタンで回答。
- 採点ボタンを押すと結果表示+平均スコア更新。
- 平均スコアを
JProgressBarでビジュアル表示。
💻 コード全体(豪華版)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class LogicQuizGUI extends JFrame implements ActionListener {
// 質問・選択肢・正解データ
private String[] questions = {
"問1: true && false の結果は?",
"問2: true || false の結果は?",
"問3: !(true && true) の結果は?",
"問4: false || (true && false) の結果は?"
};
private String[][] options = {
{"true", "false"},
{"true", "false"},
{"true", "false"},
{"true", "false"}
};
private int[] answers = {1, 0, 1, 1}; // 正解インデックス
// GUI部品
private ButtonGroup[] groups;
private JRadioButton[][] radios;
private JButton submitButton;
private JLabel resultLabel;
private JProgressBar progressBar;
private JLabel avgLabel;
// 採点管理
private int totalScore = 0;
private int attempts = 0;
public LogicQuizGUI() {
setTitle("論理演算子クイズ - 豪華版");
setSize(480, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new BorderLayout());
// メインパネル
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new GridLayout(questions.length + 2, 1));
groups = new ButtonGroup[questions.length];
radios = new JRadioButton[questions.length][2];
// 質問と選択肢を配置
for (int i = 0; i < questions.length; i++) {
JPanel qPanel = new JPanel();
qPanel.setLayout(new GridLayout(3, 1));
qPanel.setBorder(BorderFactory.createTitledBorder(questions[i]));
groups[i] = new ButtonGroup();
for (int j = 0; j < 2; j++) {
radios[i][j] = new JRadioButton(options[i][j]);
groups[i].add(radios[i][j]);
qPanel.add(radios[i][j]);
}
mainPanel.add(qPanel);
}
// 採点ボタン
submitButton = new JButton("採点する");
submitButton.addActionListener(this);
mainPanel.add(submitButton);
// 結果表示
resultLabel = new JLabel("ここに結果が表示されます", SwingConstants.CENTER);
avgLabel = new JLabel("平均点: 0%", SwingConstants.CENTER);
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressBar.setForeground(new Color(100, 180, 255));
JPanel resultPanel = new JPanel(new GridLayout(3, 1));
resultPanel.add(resultLabel);
resultPanel.add(avgLabel);
resultPanel.add(progressBar);
add(mainPanel, BorderLayout.CENTER);
add(resultPanel, BorderLayout.SOUTH);
}
@Override
public void actionPerformed(ActionEvent e) {
int score = 0;
for (int i = 0; i < questions.length; i++) {
for (int j = 0; j < 2; j++) {
if (radios[i][j].isSelected() && j == answers[i]) {
score++;
}
}
}
int percent = (int) ((score / (double) questions.length) * 100);
resultLabel.setText("今回の得点: " + percent + " 点 (" + score + "/" + questions.length + ")");
// 平均スコア更新
attempts++;
totalScore += percent;
int avg = totalScore / attempts;
avgLabel.setText("平均点: " + avg + "%");
progressBar.setValue(avg);
// 少し演出(プログレスバーが伸びるアニメ風)
new Thread(() -> {
int current = progressBar.getValue();
for (int i = current; i <= avg; i++) {
progressBar.setValue(i);
try {
Thread.sleep(15);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}).start();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new LogicQuizGUI().setVisible(true);
});
}
}
Javaポイント解説
| 機能 | 説明 |
|---|---|
JRadioButton | 複数選択肢から1つを選ぶボタン |
ButtonGroup | 同じ質問内で1つしか選べないようにする |
JProgressBar | 平均スコアをバーで表示(0〜100%) |
Thread.sleep() | バーがスムーズに伸びる演出 |
GridLayout | 縦に整列してきれいに配置 |


