Radio- Buttons - Event auslösen



  • Wer kann mir das Prinzip der Ereignis- Behandlung von Radio-Buttons an Hand eines Beispieles zeigen. Leider funktionieren die Beispiele in "Fachbüchern" dazu bei mir nicht.
    public boolean action(Event e, Object o){//altes Modell
    switch(e.target){
    case cbox[0]: /*behandlung*/; break;
    usw.

    hier bekomme ich die Fehlermeldung das Datentyp von e.target kein int wert ist
    Die Radio- Buttens werden dargestellt, es gelingt mir aber keine Ereignis-Beh.
    auch nicht über ItemListener. Eigenartigerweise git es die Probleme nicht bei
    normalen Checkboxen (also mit Haken) .
    In meinen 4 Java- Büchern gibt es dazu nur formelle Aussagen mit Code- Ausschnitten, die allesamt nicht zum Erfolg führen. Konkrete Beispiele fehlen leider.

    😕
    Für jeden Hinweis bin ich dankbar.



  • Manchmal ist es verrückt. Ich habe das Proplem selst gelöst
    Hier der Code für alle, die ähnliche Probleme haben:
    import java.awt.;
    import java.awt.event.
    ;

    public class Auswahl extends Frame implements ItemListener
    {
    //Objekte für die Komponenten (Steuerelemente, Controls)
    Button okBut, clrBut;//Buttons = und Clear
    TextField txtField1; //Eingabefeld für Zahl 1
    TextField txtField2; //Eingabefeld für Zahl 2
    TextField txtField3; //Ergebnisfeld

    CheckboxGroup cbGr; //Radio- Button Gruppe
    Checkbox[] cbox; //Mitglieder als Feld

    Panel radPan; //Panel für Radio-Buttons
    Panel butPan; // Panel für Schaltfläche
    Panel inputPan; // Panel für Eingaben
    Panel outputPan; // Panel für Ausgabe
    Panel tmpPan; // Panel für Panels butPan und outputPan

    String winkel,wert; //Ein- Ausgaben als String
    double wi,we; //Ein- Ausgaben als double- Zahl

    Auswahl() //Konstruktor
    {

    okBut = new Button( "Ende" );
    clrBut = new Button( "Löschen" );

    txtField1 = new TextField(); // Eingabefeld für limit
    txtField2 = new TextField(); // dto. für gemessen
    txtField3 = new TextField(); // Anzeigefeld für Ergebnis
    txtField3.setEditable( false ); // Ausgabe gesperrt, wenn keine Eingabe
    //wichtig, da sonst Programmabbruch

    cbGr = new CheckboxGroup();//Die Gruppe
    cbox = new Checkbox[4];//4 Mitglieder
    cbox[0] = new Checkbox("Sinus",cbGr,false);
    cbox[1] = new Checkbox("Cosinus",cbGr,false);
    cbox[2] = new Checkbox("Tangens",cbGr,false);
    cbox[3] = new Checkbox("Cotangens",cbGr,false);
    cbox[0].addItemListener(this);
    cbox[1].addItemListener(this);
    cbox[2].addItemListener(this);
    cbox[3].addItemListener(this);

    //Panel für die Radio- Buttons
    radPan = new Panel();
    //radPan.setLayout(new GridLayout(4,1));
    radPan.add(cbox[0]);
    radPan.add(cbox[1]);
    radPan.add(cbox[2]);
    radPan.add(cbox[3]);

    // Panel für die drei Schaltflächen:
    // standardmäßig Flow-Layout
    butPan = new Panel();
    butPan.add( okBut ); // "="-Taste
    butPan.add( clrBut ); // Löschtaste

    // Panel für die Zahleneingabe:
    // GridLayout mit zwei Zeilen und zwei Spalten
    inputPan = new Panel();
    inputPan.setLayout( new GridLayout(2,2) );
    inputPan.add( new Label("Grad (0...90)"));
    inputPan.add( txtField1 );
    inputPan.add( new Label("Gemessen :") );
    inputPan.add( txtField2 );

    // Panel für die Ergebnisanzeige:
    // GridLayout mit einer Zeile und zwei Spalten
    outputPan = new Panel();
    outputPan.setLayout( new GridLayout(1,2) );
    outputPan.add( new Label("Ergebnis:"));
    outputPan.add( txtField3 );

    // Plazieren des Schaltflächen-Panels (oben) und des
    // Ergebnis-Panels (unten) auf einem Panel
    // als BorderLayout:
    tmpPan = new Panel();
    tmpPan.setLayout( new BorderLayout() );
    tmpPan.add( "North", butPan);
    tmpPan.add( "South", outputPan );

    // Layout des gesamten Applets festlegen:
    // BorderLayout mit InputPanel (oben) und
    // zusammengefaßtes Panel (unten) als BorderLayout:
    setLayout( new BorderLayout( ) );
    add( "North", radPan);
    add( "Center", inputPan );
    add("South",tmpPan);
    setBackground(Color.yellow);
    setForeground(Color.blue);
    }

    //Hauptprogramm erzeugt Hauptfenster, ruft Konstruktor der AußenKlasse auf
    //und erzeugt damit das Layout
    public static void main (String args[])
    {
    Frame f = new Auswahl();// Fensterobjekt erzeugen

    f.setSize(400,170); //Fenstergröße festlegen
    f.setVisible(true); //Fenster anzeigen

    f.addWindowListener(new WindowAdapter() //Fenster schließen
    { //über X
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    });
    }
    // Ereignisbehandlung: altes Modell
    //Hier wird die Ereignis- metode action() überschrieben
    public boolean action( Event e, Object o )
    {
    if( e.target instanceof Button ) //Buttons auswerten
    {
    if( "Löschen".equals( o ) ) //Auswertung des = Button's
    {
    txtField1.setText( " "); //alle Textfelder löschen
    txtField2.setText( " ");
    txtField3.setText( " ");
    repaint();//neu zeichnen
    }

    if( "Ende".equals( o ) ) //Auswertung des = Button's
    {
    repaint();//neu zeichnen
    setBackground(Color.green);
    System.out.println("Danke fuer Ihre Mitarbeit");
    System.exit(0);

    }
    return true;//notwendig weil so vorgesehen

    }
    return false;
    }
    //Ereignisbehandlung neues Modell,hier nicht vergessen:Komponente.addItemListener(this);
    public void itemStateChanged(ItemEvent e)
    {
    String s = (String) e.getItem();

    if(s=="Sinus")
    {
    if(e.getStateChange()==1)//liefert 1 oder 2
    {
    winkel = new String(txtField1.getText()); //Eingabe des Winkels

    double wi = Double.valueOf(winkel). doubleValue();//String in double

    we = Math.sin(wi*Math.PI/180);//Sinuswert berechnen

    wert = String.valueOf(we);//double in String

    txtField3.setText(wert);//Ergebnis schreiben
    //repaint();//Neu zeichnen
    //System.out.println("Sinus= "+e.getStateChange()+" "+we);//Konsole
    }
    }

    if(s=="Cosinus")
    {
    if(e.getStateChange()==1)//liefert 1 oder 2
    {
    winkel = new String(txtField1.getText()); //Eingabe des Winkels

    double wi = Double.valueOf(winkel). doubleValue();//String in double

    we = Math.cos(wi*Math.PI/180);//Sinuswert berechnen

    wert = String.valueOf(we);//double in String

    txtField3.setText(wert);//Ergebnis schreiben
    }
    }

    if(s=="Tangens")
    {
    if(e.getStateChange()==1)//liefert 1 oder 2
    {
    winkel = new String(txtField1.getText()); //Eingabe des Winkels

    double wi = Double.valueOf(winkel). doubleValue();//String in double

    we = Math.tan(wi*Math.PI/180);//Sinuswert berechnen

    wert = String.valueOf(we);//double in String

    txtField3.setText(wert);//Ergebnis schreiben
    }
    }

    if(s=="Cotangens")
    {
    if(e.getStateChange()==1)//liefert 1 oder 2
    {
    winkel = new String(txtField1.getText()); //Eingabe des Winkels

    double wi = Double.valueOf(winkel). doubleValue();//String in double

    we = 1/(Math.tan(wi*Math.PI/180));//Sinuswert berechnen

    wert = String.valueOf(we);//double in String

    txtField3.setText(wert);//Ergebnis schreiben
    }
    }
    }
    }
    🙂



  • Hallo,

    ich bezieh mich hier auf Swing JRadioButtons.
    Du musst zunächst das Interface "ActionListener" in die entsprechende Klasse implementieren z.B.:

    public class Test implements ActionListener
    {
    ButtonGroup group;
    JRadioButton button1;
    JRadioButton button2;
    //...

    dann ein ButtonGroup-Objekt erzeugen (welche RadioButtons sollen zusammengehören):

    group = new ButtonGroup();

    dann die Buttons erzeugen (die boolean-Werte geben an welcher Button am Anfang aktiviert ist):

    button1=new JRadioButton("Button 1", true);
    button2=new JRadioButton("Button 2", false);

    den beiden RadioButtons den ActionListener zuweisen:

    button1.addActionListener(this);
    button2.addActionListener(this);

    dann werden die beiden Buttons der Gruppe zugewiesen:

    group.add(button1);
    group.add(button2);

    die Ereignisbehandlung sieht dann folgendermaßen aus:

    Variante 1:

    public void actionPerformed(ActionEvent event)
    {
    String cmd=event.getActionCommand();
    if(cmd.equals("Button 1"))
    {
    System.out.println("Button 1 gewählt");
    }
    else if(cmd.equals("Button 2"))
    {
    System.out.println("Button 2 gewählt");
    }
    }

    Variante 2 (zu bevorzugen):

    public void actionPerformed(ActionEvent event)
    {
    if(e.getSource()==button1)
    {
    System.out.println("Button 1 gewählt");
    }
    else if(e.getSource()==button2)
    {
    System.out.println("Button 2 gewählt");
    }
    }

    Hier als ganzes Beispiel:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Test
    extends JFrame
    implements ActionListener
    {
      ButtonGroup group;
      JRadioButton button1;
      JRadioButton button2;
    
      public Test()
      {
        super("JRadioButton Demo");
        getContentPane().setLayout(new FlowLayout());
    
        group = new ButtonGroup();
        button1=new JRadioButton("Button 1", true);
        button2=new JRadioButton("Button 2", false);
    
        button1.addActionListener(this);
        button2.addActionListener(this);
    
        group.add(button1);
        group.add(button2);
    
        getContentPane().add(button1);
        getContentPane().add(button2);
    
        pack();
        setVisible(true);
      }
    
      public void actionPerformed(ActionEvent e)
      {
          if(e.getSource()==button1)
          {
    	      System.out.println("Button 1 gewählt");
          }
          else if(e.getSource()==button2)
          {
       	   System.out.println("Button 2 gewählt");
          }
      }
    
      public static void main(String[] args)
      {
             new Test();
      }
    }
    

    Habs jetzt nicht getestet, müsste aber funktionieren...

    MfG



  • @Erich: Bitte benutze das nächste Mal Code-Tags. Kein Mensch liest Code, der so dasteht wie es der deinige jetzt tut ... danke.



  • Habt vielen Dank für Eure wertvollen Hinweise, ich habe bis her nur in C/C++ mit dem Visual- Studio 6.0 C++ gearbeitet. Hier ist vieles wesentlich bequemer zu handhaben, obwohl es natürlich hier auch Probleme gibt.
    Allgemein kann man sagen: Programmieren ist ein Abenteuer ohne Ende, immer spannend nie 100%- tig durchschaubar und stets mit Überraschungen gespickt. Ich glaube auch der beste Programmierer lernt stets dazu.
    Programmieren ist wie Rudern gegen den Strom, sobald man aufhört, treibt man zurück.

    Tschüß Erich


Anmelden zum Antworten