Wie kann man Buttons gruppieren, sodass nur einer aus einer Gruppe selektierbar ist?

ButtonGroup Eine ButtonGroup kann für alle Komponenten verwendet werden, die von AbstractButton erben und den Status 'selected' besitzen können.

Das Prinzip wird beim vorliegenden Beispiel anhand von funktionslosen Radio-Buttons, Checkboxen und Toggle-Buttons demonstriert. Das Prinzip ist für alle drei Button-Typen identisch: In der Methode initGUI() werden in insgesamt sechs Reihen (exkl. zwei Reihen mit JLabel für die Überschriften) jeweils drei Buttons auf eine Zeile gesetzt. Die oberen drei Reihen zeigen gruppierte Buttons, die unteren ungruppierte. Der Screenshot zeigt, dass bei gruppierten Buttons jeweils nur einer aus einer Gruppe selektiert werden kann. Wird ein anderer selektiert, so wird die Selektion des ehemals gewählten aufgehoben.
Ungruppierte Buttons können - etwa im Gegensatz zu HTML-RadioButtons - alle gleichzeitig ausgewählt werden. Der untere Bereich zeigt dies.

Im Quelltext wird zunächst pro Gruppe eine ButtonGroup deklariert und dieser mit der Methode add() die zu gruppierenden Buttons hinzugefügt. Die ButtonGroup ist keine Komponente, sodass dem die Buttons aufnehmenden Container diese selbst und nicht die ButtonGroup hinzugefügt werden muss.

import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;
import javax.swing.border.EmptyBorder;

public class ButtonGroupDemo extends JFrame {

    public ButtonGroupDemo() {

        initGUI();

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setTitle("ButtonGroupDemo");
        this.setVisible(true);
    }

    private void initGUI() {
        JPanel rbGroupPanel = new JPanel(new FlowLayout());
        ButtonGroup bg = new ButtonGroup();
        JRadioButton rbg1 = new JRadioButton();
        bg.add(rbg1);
        rbGroupPanel.add(rbg1);
        JRadioButton rbg2 = new JRadioButton();
        bg.add(rbg2);
        rbGroupPanel.add(rbg2);
        JRadioButton rbg3 = new JRadioButton();
        bg.add(rbg3);
        rbGroupPanel.add(rbg3);

        JPanel cbGroupPanel = new JPanel(new FlowLayout());
        ButtonGroup bg1 = new ButtonGroup();
        JCheckBox cbg1 = new JCheckBox();
        bg1.add(cbg1);
        cbGroupPanel.add(cbg1);
        JCheckBox cbg2 = new JCheckBox();
        bg1.add(cbg2);
        cbGroupPanel.add(cbg2);
        JCheckBox cbg3 = new JCheckBox();
        bg1.add(cbg3);
        cbGroupPanel.add(cbg3);
        
        JPanel tbGroupPanel = new JPanel(new FlowLayout());
        ButtonGroup bg2 = new ButtonGroup();
        JToggleButton tbg1 = new JToggleButton("1");
        bg2.add(tbg1);
        tbGroupPanel.add(tbg1);
        JToggleButton tbg2 = new JToggleButton("2");
        bg2.add(tbg2);
        tbGroupPanel.add(tbg2);
        JToggleButton tbg3 = new JToggleButton("3");
        bg2.add(tbg3);
        tbGroupPanel.add(tbg3);

        JPanel rbNoGroupPanel = new JPanel(new FlowLayout());
        JRadioButton rbn1 = new JRadioButton();
        rbNoGroupPanel.add(rbn1);
        JRadioButton rbn2 = new JRadioButton();
        rbNoGroupPanel.add(rbn2);
        JRadioButton rbn3 = new JRadioButton();
        rbNoGroupPanel.add(rbn3);

        JPanel cbNoGroupPanel = new JPanel(new FlowLayout());
        JCheckBox cb1 = new JCheckBox();
        cbNoGroupPanel.add(cb1);
        JCheckBox cb2 = new JCheckBox();
        cbNoGroupPanel.add(cb2);
        JCheckBox cb3 = new JCheckBox();
        cbNoGroupPanel.add(cb3);
        
        JPanel tbNoGroupPanel = new JPanel(new FlowLayout());
        JToggleButton tb1 = new JToggleButton("1");
        tbNoGroupPanel.add(tb1);
        JToggleButton tb2 = new JToggleButton("2");
        tbNoGroupPanel.add(tb2);
        JToggleButton tb3 = new JToggleButton("3");
        tbNoGroupPanel.add(tb3);

        this.setLayout(new GridLayout(8, 1));
        JLabel gLabel = new JLabel("Gruppiert:");
        gLabel.setBorder(new EmptyBorder(0, 5, 0, 5));
        this.add(gLabel);
        this.add(rbGroupPanel);
        this.add(cbGroupPanel);
        this.add(tbGroupPanel);
        JLabel nLabel = new JLabel("Nicht gruppiert:");
        nLabel.setBorder(new EmptyBorder(0, 5, 0, 5));
        this.add(nLabel);
        this.add(rbNoGroupPanel);
        this.add(cbNoGroupPanel);
        this.add(tbNoGroupPanel);
    }

    public static void main(String[] args) {
        new ButtonGroupDemo();
    }
}