Java SwingによるGUIアプリケーション:整数の選択と合計計算

整数の選択と合計計算

課題概要

本実験では、チェックボックスとテキストフィールドを使用したSwingアプリケーションを作成します。ユーザーが必要に応じて整数を選択し、選択した整数の合計を計算する 기능을実装します。

実装要件

  • 定義された整数のセットをCheckboxで的画面に表示する
  • 「すべて選択」ボタンで全てのCheckboxを選択状態にする
  • 「複数選択」ボタンで選択されたCheckboxの値をテキストフィールドに表示する
  • テキストフィールドに整数を直接入力し、「合計」ボタンをクリックすると選択された整数の合計を計算して表示する
  • 整数に変換できない文字列が入力された場合、警告ダイアログを表示し 해당テキストフィールドをクリアする

追加要件

  1. フレームのコンストラクタで整数の個数を指定できるようにする
  2. Checkbox配列とテキストフィールド配列を使用する
  3. 合計計算メソッドを以下のように宣言する
public int calculateSum(JTextField[] fields)

実装コード

package exercises;

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

public class IntegerCalculator extends Frame implements ActionListener {
    private JTextField[] inputFields = new JTextField[6];
    private JCheckBox[] checkBoxes = new JCheckBox[6];
    private TextField resultField = new TextField();
    private Button selectAllBtn, multiSelectBtn, sumBtn;
    
    public IntegerCalculator() {
        super("整数の選択と計算");
        setBounds(100, 100, 400, 380);
        setLayout(null);
        
        String[] values = {"42", "18", "65", "31", "27", "83"};
        
        for (int i = 0; i < values.length; i++) {
            checkBoxes[i] = new JCheckBox(values[i]);
            inputFields[i] = new JTextField();
            add(checkBoxes[i]);
            add(inputFields[i]);
            checkBoxes[i].setBounds(30, 40 + 45 * i, 70, 35);
            inputFields[i].setBounds(120, 48 + 45 * i, 100, 25);
        }
        
        selectAllBtn = new Button("すべて選択");
        selectAllBtn.setBounds(30, 320, 80, 30);
        add(selectAllBtn);
        selectAllBtn.addActionListener(this);
        
        multiSelectBtn = new Button("複数選択");
        multiSelectBtn.setBounds(130, 320, 80, 30);
        add(multiSelectBtn);
        multiSelectBtn.addActionListener(this);
        
        sumBtn = new Button("合計");
        sumBtn.setBounds(230, 320, 80, 30);
        add(sumBtn);
        sumBtn.addActionListener(this);
        
        resultField.setBounds(320, 320, 60, 30);
        resultField.setFont(new Font("Serif", Font.PLAIN, 16));
        add(resultField);
        
        setVisible(true);
        addWindowListener(new WindowTerminator());
    }
    
    private void selectAllItems() {
        for (int i = 0; i < checkBoxes.length; i++) {
            if (!checkBoxes[i].isSelected()) {
                checkBoxes[i].doClick();
            }
        }
        syncFieldsWithCheckboxes();
    }
    
    private void syncFieldsWithCheckboxes() {
        for (int i = 0; i < checkBoxes.length; i++) {
            if (checkBoxes[i].isSelected()) {
                inputFields[i].setText(checkBoxes[i].getText());
            }
        }
    }
    
    public int calculateSum(JTextField[] fields) {
        int total = 0;
        for (int i = 0; i < fields.length; i++) {
            if (!checkBoxes[i].isSelected()) {
                continue;
            }
            
            String content = fields[i].getText();
            if (content == null || content.trim().isEmpty()) {
                continue;
            }
            
            try {
                total += Integer.parseInt(content.trim());
            } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(
                    this,
                    "「" + content + "」は整数に変換できません",
                    "入力エラー",
                    JOptionPane.WARNING_MESSAGE
                );
                inputFields[i].setText("");
            }
        }
        return total;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == selectAllBtn) {
            selectAllItems();
        } else if (e.getSource() == multiSelectBtn) {
            syncFieldsWithCheckboxes();
        } else if (e.getSource() == sumBtn) {
            resultField.setText(String.valueOf(calculateSum(inputFields)));
        }
    }
    
    public static void main(String[] args) {
        new IntegerCalculator();
    }
    
    private class WindowTerminator extends WindowAdapter {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }
}

コードのポイント

1. フレームの構成

Frameクラスを継承し、ActionListenerインターフェースを実装することで、ボタンクリック時のアクションを処理できます。コンストラクタ内でコンポーネント配置とリスナー登録を行います。

2. 配列の活用

Checkboxとテキストフィールドをそれぞれ配列で宣言することで、複数のアイテムを効率的に管理できます。ループ処理を使用して全てのコンポーネントを配置します。

3. 合計計算メソッド

calculateSumメソッドでは、各テキストフィールドの内容をチェックし、空文字列の場合は無視、整数をパースできない場合は警告ダイアログを表示してフィールドをクリアします。これにより堅牢な入力処理を実現しています。

4. WindowAdapterの使用

WindowListenerインターフェースの実装では全てのメソッドをオーバーライドする必要がありますが、WindowAdapterを継承することで必要なメソッドのみをオーバーライドできます。

タグ: Java AWT Swing GUI checkbox

7月30日 03:00 投稿