[Java] JRadioButton Zustand überprüfen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von MasterJulian, 1. Mai 2012 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 1. Mai 2012
    Zuletzt bearbeitet: 1. Mai 2012
    JRadioButton Zustand überprüfen

    Ich muss fürs Studium Java lernen (ich mag Java überhaupt nicht, v.A. das GUI Zeugs).
    In der Übung die ich gerade mache, habe ich eine Gruppe von 3 JRadioButtons und einen normalen JButton. Beim drücken des Buttons sollen je nach dem welcher JRadioButton ausgewählt ist unterschiedliche Aktionen durchgeführt werden. Der ActionListener des Buttons ist eine eigene Klassendatei. Meine momentane, sehr unsaubere Lösung ist es, dem ActionListener im Konstruktor einfach eine Referenz auf zwei JRadioButtons zu übergeben und auf .isSelected() zu prüfen. Ungefähr so:
    Code:
    //MyListener.class
    public class MyListener implements java.awt.event.ActionListener
    {
     private JRadioButton bt1;
     private JRadioButton bt2;
     
     public MyListener(JRadioButton bt1, JRadioButton bt2)
     {
     this.bt1 = bt1;
     this.bt2 = bt2;
     }
     
     @Override
     public void actionPerformed(ActionEvent e) {
     if(this.bt1.isSelected())
     {
     machwas();
     }
     else if(this.bt2.isSeleted())
     {
     machnochwas();
     }
     else
     {
     machwasanderes();
     } 
     }
    
    }
    //GUI Klasse Konstruktor
    public MyGUI ...
    {
    [...]
    JRadioButton rbt1 = new JRadioButton("Option1",true);
    JRadioButton rbt2 = new JRadioButton("Option2");
    JRadioButton rbt3 = new JRadioButton("Option3");
    ButtonGroup group = new ButtonGroup();
    group.add(rbt1);
    group.add(rbt2);
    group.add(rbt3);
    JButton bt = new JButton("Auswerten");
    bt.AddActionListener(new MyListener(rbt1,rbt2));
    [...]
    
    Da muss es doch einen schöneren Weg geben. Via Google habe ich nichts brauchbares finden können (oder die falschen Begriffe benutzt).
     
  2. 1. Mai 2012
    AW: JRadioButton Zustand überprüfen

    Hey. Mir würde spontan eine Lösung mit einer anonymen Klasse einfallen. Das erspart dir die seperate Klasse, welche du ja sowieso nur einmal an den Button hängst und sie dann nie wieder brauchst. Von der anonymen Klasse kannst du direkt auf deine RadioButtons zugreifen.

    In Code:
    Spoiler
    Code:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     *
     * @author Mever
     */
    public class ActionProblem extends JFrame {
    
     private JRadioButton rb1;
     private JRadioButton rb2;
     private JRadioButton rb3;
     private JButton button1;
     private ButtonGroup bg;
    
     public ActionProblem() {
     super("Demo");
     initRadioButtons();
     initButtons();
     setSize(100, 100);
     Container c = new Container();
     c.setLayout(new GridLayout(1, 4));
     c.add(rb1);
     c.add(rb2);
     c.add(rb3);
     add(c, BorderLayout.CENTER);
     add(button1, BorderLayout.SOUTH);
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
     setVisible(true);
     }
    
     private void initRadioButtons() {
     rb1 = new JRadioButton("1", true);
     rb2 = new JRadioButton("2");
     rb3 = new JRadioButton("3");
     bg = new ButtonGroup();
     bg.add(rb1);
     bg.add(rb2);
     bg.add(rb3);
     }
    
     private void initButtons() {
     button1 = new JButton("Druck");
     button1.addActionListener(new ActionListener() {
    
     @Override
     public void actionPerformed(ActionEvent e) {
     if (rb1.isSelected()) {
     System.out.println("RadioButton 1 Selektiert");
     } else if (rb2.isSelected()) {
     System.out.println("RadioButton 2 Selektiert");
     } else if (rb3.isSelected()) {
     System.out.println("RadioButton 3 Selektiert");
     }
     }
     });
     }
    
     public static void main(String[] args) {
     ActionProblem actionProblem = new ActionProblem();
     }
    }
    
    
    (Kannst du so durch den Compiler jagen zum testen)

    Die anonyme Klasse findest du in der Methode initButtons().

    Ich weis nicht ob das für dich "schöner" ist es ist zumindest eine Variante. Falls nicht hätte ich noch eine zweite Idee, welche ich dir aber erst dann verate wenn dir das nicht gefällt

    Greetz Mever
     
    1 Person gefällt das.
  3. 1. Mai 2012
    AW: JRadioButton Zustand überprüfen

    Danke, daran hatte ich auch schon gedacht. Allerdings ist der Listener im Klassendiagramm das es zur Übung gab als externe Klasse eingezeichnet. Da mein Prof aber bei nahezu jeder Übung Fehler drin hat sehe ich die Klassendiagramme eh mehr als Vorschlag. Wenn jemand eine saubere Lösung für eine externe Klasse kennt wäre ich natürlich auch nicht abgeneigt.
     
    1 Person gefällt das.
  4. 1. Mai 2012
    Zuletzt bearbeitet: 2. Mai 2012
    AW: JRadioButton Zustand überprüfen

    EDIT: ACHTUNG, HATTE EIN TIPPFEHLER IM CODE! IST NUN KORRIGIERT(2mal rbt2 einen ActionCommand zugewiesen gehabt und rbt3 kein ActionCommand)!
    Wobei man in der Theorie nichtmal einen ActionCommand setzen müsste, dann nimmt er halt die Option, die du im Konstruktor da eingegeben hast. Wenn man aber AC's setzt, dann kannst du die .z.b in ein Interface auslagern und bei beiden einbinden oder halt public im gui hinterlegen... nur so ne Idee.


    Gerade mal zusammengebaut und funktioniert, warum man das jetzt aber so machen sollte, kA. Kann man vllt. auch noch anders lösen, aber ist es halt dynamisch und man kann in der Theorie das ganze GUI mit RadioButtons vollknallen ohne mehr Code zu produzieren.

    GUI
    Spoiler
    Code:
    package gui;
    
    import java.awt.FlowLayout;
    
    import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JRadioButton;
    
    public class GUI extends JFrame {
     private JRadioButton rbt1 = null;
     private JRadioButton rbt2 = null;
     private JRadioButton rbt3 = null;
     private ButtonGroup group = null;
     private JButton bt = null;
    
     public static void main(String[] args) {
     GUI gui = new GUI();
     }
    
     // *************************************************
     // *************************************************
     // *************************************************
    
     public GUI() {
    
     makeGUI();
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     setSize(500, 500);
    
     setVisible(true);
     }
    
     private void makeGUI() {
    
     setLayout(new FlowLayout());
    
     rbt1 = new JRadioButton("Option1", true);
     rbt2 = new JRadioButton("Option2");
     rbt3 = new JRadioButton("Option3");
    
     rbt1.setActionCommand("op1");
     rbt2.setActionCommand("op2");
     rbt3.setActionCommand("op3");
    
     group = new ButtonGroup();
     group.add(rbt1);
     group.add(rbt2);
     group.add(rbt3);
     bt = new JButton("Auswerten");
    
     add(rbt1);
     add(rbt2);
     add(rbt3);
    
     bt.addActionListener(new MyListener(this.getContentPane().getComponents()));
     // alternativ this übergeben und dann in der Listener-Klasse die Componenten 
     // abgreifen
     add(bt);
     }
    
    }
    

    MyListener
    Spoiler
    Code:
    package gui;
    
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JRadioButton;
    
    public class MyListener implements ActionListener {
     private Component[] comp = null;
    
     public MyListener(Component[] comp) {
     this.comp = comp;
     }
    
     @Override
     public void actionPerformed(ActionEvent ae) {
    
     for (int compInd = 0; compInd < comp.length; compInd++) {
    
     if (comp[compInd] instanceof JRadioButton) {
     JRadioButton jrb = (JRadioButton) comp[compInd];
    
     if (jrb.isSelected()) {
     String actionCommand = jrb.getActionCommand();
    
     System.out.println("actionCommand: " + actionCommand);
     // Hier könnte ,break;' stehen, wenn man nur ein 
     // jrb.isSelected() finden soll, ansonsten checkt er auch 
     // alle weiteren
     }
    
     }
     }
    
     }
    
    }
    


    Man könnte auch gleich, wenn das GUI zusammengebaut ist, alle RadioButtons in ein Array schreiben und das übergeben und das nicht immer und immer wieder machen, wie ich es jetzt hier im Beispiel gemacht habe.

    Mit dem jetzigen Aufbau wäre es außerdem auch möglich, ohne den Code im Listener massiv zu ändern, dass sogar mehrere Buttons gleichzeitig aktiv sein können.



    Ich hoffe du meinst sowas in der Richtung oder kannst damit was anfangen, den wenn du es auslagern willst und abfragen, musst du ja irgendwas übergeben - da kommste ja gar nicht drum herum. Die Frage ist dann nur, wie man es machen will.
     
    1 Person gefällt das.
  5. 2. Mai 2012
    AW: JRadioButton Zustand überprüfen

    Ich würde das ganze folgendermaßen lösen:

    Main-GUI
    Spoiler
    Code:
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    
    public class Main {
     private JFrame frame;
     private RadioPanel radioPanel;
    
     public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
     public void run() {
     try {
     Main window = new Main();
     window.frame.setVisible(true);
     } catch (Exception e) {
     e.printStackTrace();
     }
     }
     });
     }
    
     public Main() {
     initialize();
     }
    
     private void initialize() {
     frame = new JFrame();
     frame.setBounds(100, 100, 450, 300);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     radioPanel = new RadioPanel();
     frame.add(radioPanel);
     
     frame.pack();
     frame.setVisible(true);
     }
    }
    

    RadioPanel
    Code:
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    
    public class RadioPanel extends JPanel implements ActionListener {
     private JRadioButton rbt1, rbt2, rbt3;
    
     public RadioPanel() {
     super(new FlowLayout());
     initialize();
     }
    
     private void initialize() {
     rbt1 = new JRadioButton("Option1", true);
     rbt2 = new JRadioButton("Option2");
     rbt3 = new JRadioButton("Option3");
     add(rbt1);
     add(rbt2);
     add(rbt3);
    
     ButtonGroup group = new ButtonGroup();
     group.add(rbt1);
     group.add(rbt2);
     group.add(rbt3);
    
     JButton bt = new JButton("Auswerten");
     bt.addActionListener(this);
     add(bt);
     }
    
     @Override
     public void actionPerformed(ActionEvent arg0) {
     if (this.rbt1.isSelected()) {
     // machwas();
     } else if (this.rbt2.isSelected()) {
     // machnochwas();
     } else {
     // machwasanderes();
     }
     }
    }
    
    Wenn nötig, kann man die einzelnen Methoden, die letztlich eine Aktion ausführen auch noch in ein Interface packen oder so.
     
    1 Person gefällt das.
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.