Java | フラグ管理を使ったメニューのON/OFFを作るステップ実装

Java Java
スポンサーリンク

では 動的に複数メニュー(最大32個)を管理できるGUI版 を作ります。
各メニューはボタンでON/OFF切り替えでき、現在のビットフラグ状態も表示されます。


サンプル:動的メニュー&ビット表示GUI(最大32個)

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

public class DynamicMenuGUI {
    public static void main(String[] args) {
        // 最大32個のメニューをビットフラグで管理
        String[] menuNames = {
            "音楽", "効果音", "通知", "ダークモード", "バイブレーション",
            "自動保存", "位置情報", "Wi-Fi", "Bluetooth", "マイク",
            "カメラ", "画面録画", "省電力", "通知サウンド", "アラーム",
            "バックグラウンド同期", "GPS", "データ通信", "振動通知", "モバイルデータ",
            "画面回転", "スクリーンショット", "LED通知", "アプリ更新", "位置共有",
            "通知履歴", "テーマ", "チャット通知", "メール通知", "SNS通知",
            "広告表示", "ログ送信"
        };

        int[] flags = {0}; // 1つの整数で最大32個のフラグ管理

        JFrame frame = new JFrame("動的メニューON/OFF");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 800);
        frame.setLayout(new BorderLayout());

        // メニューパネル
        JPanel menuPanel = new JPanel();
        menuPanel.setLayout(new GridLayout(menuNames.length, 1, 5, 5));

        JButton[] buttons = new JButton[menuNames.length];

        for (int i = 0; i < menuNames.length; i++) {
            int bit = 1 << i; // このメニューのビット
            buttons[i] = new JButton(menuNames[i] + ": OFF");
            buttons[i].setBackground(Color.RED);
            buttons[i].setOpaque(true);
            buttons[i].setBorderPainted(false);

            buttons[i].addActionListener(e -> {
                flags[0] ^= bit; // ON/OFF切り替え
                updateButton((JButton) e.getSource(), (flags[0] & bit) != 0);
                updateFlagLabel(flags[0]); // ビット状態更新
            });

            menuPanel.add(buttons[i]);
        }

        // ビットフラグ表示ラベル
        JLabel flagLabel = new JLabel("現在のフラグ: 00000000000000000000000000000000");
        flagLabel.setFont(new Font("Monospaced", Font.PLAIN, 14));

        // 更新メソッド
        Runnable updateFlagLabel = () -> flagLabel.setText(
                "現在のフラグ: " + String.format("%32s", Integer.toBinaryString(flags[0])).replace(' ', '0')
        );

        // 初期表示
        updateFlagLabel.run();

        frame.add(new JScrollPane(menuPanel), BorderLayout.CENTER);
        frame.add(flagLabel, BorderLayout.SOUTH);
        frame.setVisible(true);

        // 内部メソッド
        void updateButton(JButton button, boolean isOn) {
            if (isOn) {
                button.setText(button.getText().split(":")[0] + ": ON");
                button.setBackground(Color.GREEN);
            } else {
                button.setText(button.getText().split(":")[0] + ": OFF");
                button.setBackground(Color.RED);
            }
        }
    }
}
Java

特徴

  1. 32個までメニューを追加可能 → 1つの整数で管理
  2. 各ボタンでON/OFF切り替え → 色で直感的に確認
  3. 現在のビットフラグも表示 → どのビットが立っているか一目で確認
  4. ビット演算を使うことで効率的に状態を管理できる

💡 応用アイデア

  • フラグを増やす場合は long(64ビット)や配列で管理
  • ON/OFF状態を保存してアプリ再起動時に復元
  • フラグに応じて機能を自動ON/OFFする(例:チェックボックス連動)
タイトルとURLをコピーしました