では、前回の「論理演算子を使った採点プログラム」を、Java の Swing(GUI)版 に進化させましょう。
このバージョンでは、ユーザーがウィンドウ上で点数を入力し、「判定する」ボタンを押すと結果が画面に表示されます。
仕様(完成イメージ)
- 3教科(数学・英語・理科)の点数を入力するテキストフィールド
- 「判定する」ボタン
- 判定結果(特待生/合格/不合格)と平均点をラベル表示
- アイコンや絵文字でわかりやすく
- 論理演算子
&&,||,!を全て使用
💻 完成コード(コメント付き)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class LogicQuizGUI extends JFrame {
private JTextField mathField, englishField, scienceField;
private JLabel resultLabel, avgLabel, detailLabel;
public LogicQuizGUI() {
setTitle("成績判定プログラム(論理演算子編)");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 350);
setLocationRelativeTo(null); // 画面中央に表示
setLayout(new GridLayout(7, 2, 10, 5));
// ラベルと入力フィールド
add(new JLabel("数学の点数:"));
mathField = new JTextField();
add(mathField);
add(new JLabel("英語の点数:"));
englishField = new JTextField();
add(englishField);
add(new JLabel("理科の点数:"));
scienceField = new JTextField();
add(scienceField);
// 判定ボタン
JButton judgeButton = new JButton("判定する");
add(judgeButton);
// 結果ラベル
resultLabel = new JLabel("結果:", SwingConstants.CENTER);
avgLabel = new JLabel("平均点:", SwingConstants.CENTER);
detailLabel = new JLabel("", SwingConstants.CENTER);
// 結果エリアを少し大きく見せる
resultLabel.setFont(new Font("Yu Gothic UI", Font.BOLD, 16));
avgLabel.setFont(new Font("Yu Gothic UI", Font.PLAIN, 14));
detailLabel.setFont(new Font("Yu Gothic UI", Font.ITALIC, 13));
add(resultLabel);
add(avgLabel);
add(detailLabel);
// ボタンクリック時の処理
judgeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
int math = Integer.parseInt(mathField.getText());
int english = Integer.parseInt(englishField.getText());
int science = Integer.parseInt(scienceField.getText());
// 判定ロジック
if (math >= 80 && english >= 80 && science >= 80) {
resultLabel.setText("🌟 特待生です!すばらしい成績!");
resultLabel.setForeground(new Color(255, 165, 0)); // オレンジ
}
else if ((math >= 60 && english >= 60) ||
(math >= 60 && science >= 60) ||
(english >= 60 && science >= 60)) {
resultLabel.setText("✅ 合格です!よくがんばりました!");
resultLabel.setForeground(new Color(0, 128, 0)); // 緑
}
else {
resultLabel.setText("❌ 不合格です。再挑戦しましょう。");
resultLabel.setForeground(Color.RED);
}
// 論理否定(!)を使った追加情報
boolean failed = !(math >= 60 || english >= 60 || science >= 60);
if (failed) {
detailLabel.setText("※ 全科目60点未満 → 再試験対象です。");
} else {
detailLabel.setText("");
}
int avg = (math + english + science) / 3;
avgLabel.setText("平均点:" + avg + " 点");
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(
LogicQuizGUI.this,
"⚠️ 数値を正しく入力してください!",
"入力エラー",
JOptionPane.ERROR_MESSAGE
);
}
}
});
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new LogicQuizGUI());
}
}
Javaポイント解説
| 要素 | 説明 |
|---|---|
JFrame | メインウィンドウ(アプリの外枠) |
JTextField | ユーザー入力欄 |
JButton | 「判定する」ボタン |
JLabel | 結果を表示するテキスト |
ActionListener | ボタンが押されたときの処理 |
GridLayout(7, 2, 10, 5) | 表形式のレイアウト(行・列・間隔) |
try-catch | 入力が数字でない場合のエラーハンドリング |
Color | ラベルの色変更(見やすく楽しく) |
実行イメージ
数学の点数: [85]
英語の点数: [78]
理科の点数: [92]
[判定する]
結果:✅ 合格です!よくがんばりました!
平均点:85 点
不合格なら赤文字で ❌、特待生ならオレンジ色で 🌟 表示されます。
発展アイデア
- 3教科以外(国語・社会)を追加して総合判定にする。
- プログレスバー(JProgressBar)で平均点を可視化。
- 成績履歴を保存(ファイル出力)機能を追加。
- 判定後に「もう一度やる」ボタンを付けてリセット。


