ButtonGroup: Welcher JRadioButton ist selektiert?

Hallo!

Ich bekomm es irgendwie nicht auf die Reihe, durch meine ButtonGroup rauszukriegen, welcher JRadioButton gerade selektiert ist.

Beispiel-Code:


public class RadioButtonProb {

	public static void main(String[] args) throws InterruptedException {
		new RadioButtonProb().start();
	}

	private void start() throws InterruptedException {
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(500, 500);
		f.setLocationRelativeTo(null);

		JRadioButton bbCodeRB = new JRadioButton("BBCode (Foren)");
		bbCodeRB.setSelected(true);
		JRadioButton htmlCodeRB = new JRadioButton("HTML-Code");
		JRadioButton onlyLinksRB = new JRadioButton("einfache Links");

		Box box = Box.createHorizontalBox();
		box.add(bbCodeRB);
		box.add(htmlCodeRB);
		box.add(onlyLinksRB);

		ButtonGroup bg = new ButtonGroup();
		bg.add(bbCodeRB);
		bg.add(htmlCodeRB);
		bg.add(onlyLinksRB);

		f.add(box);
		f.setVisible(true);

		Thread.sleep(2000);
		System.out.println("wieder wach");

		JToggleButton.ToggleButtonModel selRB = (JToggleButton.ToggleButtonModel) bg
				.getSelection();
		if (selRB.equals(onlyLinksRB)) {
			System.out.println("OK");
		} else if (selRB.equals(htmlCodeRB)) {
			System.out.println("OK");
		} else if (selRB.equals(onlyLinksRB)) {
			System.out.println("OK");
		} else {
			System.out.println("Fehler");
		}
	}

}```

Nach dem der Thread wieder aufwacht, soll mir ausgegeben werden, welcher RadioButton gerade selektiert ist.

Allerdings wird dann "Fehler" ausgegeben, also behauptet, kein RadioButton sei selektiert, obwohl das nicht stimmt.

Also ich persönlich glaube, der Fehler liegt in Zeile 36/37, da habe ich sicherlich was mit dem Casten falsch gemacht :-).

Gruß,
pcworld

So geht’s: ButtonModel selectedModel = bg.getSelection(); if (bbCodeRB.getModel() == selectedModel) { System.out.println("bbCode"); } else if (htmlCodeRB.getModel() == selectedModel) { System.out.println("HTML"); } else if (onlyLinksRB.getModel() == selectedModel) { System.out.println("Links only"); } else { System.out.println("Fehler"); }

Du machst da oben übrigens gefährliche Sachen. Entweder Zeile 10 bis 31 (würde ich bevorzugen) oder mindestens Zeile 31 sollte IMHO dadurch ersetzt werden (in Zeile 10 muss dann ein final rein): SwingUtilities.invokeLater(new Runnable() { public void run() { // ... f.setVisible(true); } }

Happy Hacking!
Ebenius

Danke!

In den if-Anweisungen vergleichst du mit dem ==-Operator jeweils zwei Objekte. Ich dachte, Objekte können nur mit Object#equals verglichen werden - was habe ich mir da falsch gemerkt :wink: (denn es funktioniert ja)?

Gruß,
pcworld

Da ich weiß, dass die ButtonGroup keine Kopien der Modelle erzeugt (und auch nicht erzeugen kann, weil sonst die Buttons ja nicht entsprechend funktionieren würden), kann ich auch auf Instanzgleichheit prüfen.

Faustregel: Wenn Du wissen möchtest, ob zwei Objekte gleich sind, nimm equals(). Wenn Du wissen möchtest, ob Du es mit dem selben Objekt zu tun hast, dann ist der Operator == Dein Freund.

Ebenius

 * RadioButtonDemo.java
 *
 * benutzt die Klasse SelectButtonGroup:
 * http://tips4java.wordpress.com/2008/11/09/select-button-group/
 */

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

public class RadioButtonDemo implements PropertyChangeListener {

    private SelectButtonGroup bg;
    public final static int BB_CODE = 0;
    public final static int HTML_CODE = 1;
    public final static int ONLY_LINKS = 2;
    private JLabel label;

    public RadioButtonDemo() {
        JFrame f = new JFrame("RadioButton Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400, 300);
        f.setLocationRelativeTo(null);
        JRadioButton bbCodeRB = new JRadioButton("BBCode (Foren)");
        JRadioButton htmlCodeRB = new JRadioButton("HTML-Code");
        JRadioButton onlyLinksRB = new JRadioButton("einfache Links");
        label = new JLabel();
        label.setForeground(Color.BLUE);
        JToolBar toolbar = new JToolBar();
        toolbar.add(bbCodeRB);
        toolbar.add(htmlCodeRB);
        toolbar.add(onlyLinksRB);
        toolbar.add(label);
        bg = new SelectButtonGroup();
        bg.add(bbCodeRB);
        bg.add(htmlCodeRB);
        bg.add(onlyLinksRB);
        bg.addPropertyChangeListener(this);
        bg.setSelectedIndex(0);
        f.add(toolbar, BorderLayout.PAGE_START);
        f.setVisible(true);
    }

    public void propertyChange(final PropertyChangeEvent evt) {
        Object source = evt.getSource();
        if (source == bg) {
            int selectedIndex = bg.getSelectedIndex();
            switch (selectedIndex) {
                case BB_CODE:
                    label.setText("BB_CODE");
                    break;
                case HTML_CODE:
                    label.setText("HTML_CODE");
                    break;
                case ONLY_LINKS:
                    label.setText("ONLY_LINKS");
                    break;
                default:
                    label.setText("Fehler");
                    break;
            }
        }
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                new RadioButtonDemo();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}```