CheckBox ohne ActionListener

RoudeLeiw

Grünschnabel
Hallo,

Ich schreibe gerade ein Programm (nur so zum testen). In einer Klasse erstelle ich meine ganze Form. Dort befindet sich auch ein Button. Wenn dieser Button gedrückt wird, möchte ich herausfinden welche CheckBoxes und Radiobuttons gerade aktiv sind. Allerdings möchte ich dies OHNE ActionListener oder ItemListener realiseren. Ist sowas möglich?

Ich poste mal mein Programm. Wie ihr seht ist die Klasse actionPerformed noch leer.

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

public class Pizza extends JFrame implements ActionListener
{
    private JTextArea bestelltext;
    private JCheckBox cb;
    private JRadioButton rbGroesse;
    private ButtonGroup bg;
    private static final String[] GROESSEN = {"klein","normal","gro\u00df"};
    private static final String[] ZUTATEN = {"Artischocken","Paprika","Ei","Spinat","Knoblauch","Mais"};
    private static final double[] GRUNDPREISE = {4,4.5,5};
    private static final double PPZ = 0.6;
    
    public Pizza(String titel, String[] zutaten, String[] groessen, double[] grundpreise, double ppz)
    {
        super(titel);
        
        if (groessen.length != grundpreise.length)
        {
            throw new IllegalArgumentException("Fehler: Argumentgrössen stimmen nicht");
        }
        
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        
        // --- Hauptpanel erzeugen
        JPanel hauptPanel = new JPanel();
        hauptPanel.setLayout(new GridLayout(0,1));
                
        // --- Panel mit den Checkboxes
        JPanel checkboxesPanel = new JPanel();
        checkboxesPanel.setLayout(new GridLayout(0,2));
        
        JCheckBox kaese = new JCheckBox("K\u00e4se");
        kaese.setSelected(true);
        kaese.setEnabled(false);
        checkboxesPanel.add(kaese);
        kaese.setName("K\u00e4se");
        
        JCheckBox tomaten = new JCheckBox("Tomaten");
        tomaten.setSelected(true);
        tomaten.setEnabled(false);
        checkboxesPanel.add(tomaten);
        tomaten.setName("tomaten");
        
        for(int i=0; i < zutaten.length; i++)
        {
            cb = new JCheckBox(zutaten[i]);
            cb.setName(zutaten[i]);
            checkboxesPanel.add(cb);
        }
        
        // --- Panel mit den Radiobuttons
        JPanel radiobuttonsPanel = new JPanel();
        radiobuttonsPanel.setLayout(new GridLayout(1,0));
        bg = new ButtonGroup();
        
        for(int i=0; i<groessen.length;i++)
        {
            rbGroesse = new JRadioButton(groessen[i]);
            radiobuttonsPanel.add(rbGroesse);
            rbGroesse.setName(groessen[i]);
            bg.add(rbGroesse);
            if (groessen[i].equals("normal"))
            {
                rbGroesse.setSelected(true);
            }
        }
                
        // --- Bestellen Button
        JButton bestellen = new JButton("Bestellen");
        bestellen.addActionListener(this);
        
        // --- AnzeigenFeld
        bestelltext = new JTextArea();
        bestelltext.setEditable(false);
        bestelltext.setLineWrap(true);
        bestelltext.setWrapStyleWord(true);
        
        // --- Alles auf hauptpanel setzen
        hauptPanel.add(checkboxesPanel);
        hauptPanel.add(radiobuttonsPanel);
        hauptPanel.add(bestellen);
        hauptPanel.add(bestelltext);
        
        add(hauptPanel);
        setSize(500,400);
        setVisible(true);
    }
    
    public void actionPerformed(ActionEvent evt)
    {
                      
    }

   
    public static void main(String[] args)
    {
        
        new Pizza("Pizza",ZUTATEN, GROESSEN, GRUNDPREISE, PPZ);
    }

}
 
Hi,
Warum willst du es denn überhaupt ohne ActionListener machen?

Alternative (umständliche) Wege würden mir jez nur Folgende einfallen:
- Listener auf dein Fenster und Klick abfangen.. Ggf. noch Position überprüfen... Im Endeffekt n selbstgeschriebener ActionListener
- Timer durchlaufen lassen und immer wieder überprüfen, was gerade aktiv ist... Umständlich, langsam und du brauchst wieder nen Listener für den Timer.

Also schilder am Besten dein Problem, warum du keinen Action/ItemListener willst.

Gruß,
Martin
 
Huhu,

Warum möchtest du einen ActionListener auslassen?

Üblicherweise wird auf Benutzereingaben bei der von dir erwähnten Komponente mithilfe von ActionListenern reagiert.

Also, was ist der Grund all dies auf den Kopf zu stellen?

mfg
 
Es ist ein ActionListener im Programm und zwar nur für den Button. Allerdings finde ich mit diesem nicht heraus welche Checkboxen und RadioButtons gerade aktiv sind. In meiner Klasse actionPerformed will ich ja herausfinden, welche Checkboxen und Radiobuttons aktiviert wurden, nur weiss ich eben nicht wie.

Könnt ihr mir da helfen?

Was die ganze für mich schwierig macht, ist dass ich die Checkboxen und die RadioButtons mithilfe einer for Schleife erstellt habe. Wie kann ich also jetzt einzelne Checkboxen überprüfen?
 
Java:
Component[] components = this.getComponents(); 
JCheckBox box = null; 
for (int i = 0; i < components.length; i++) { 
    if (components[i] instanceof JCheckBox) { 
         box=(JCheckBox)components[i];
         if(box.isSelected){
             //...
         }
    } 
}
 
Hab jetzt auch eine andere Lösung gefunden.

Code:
private JCheckBox cb [];

    private JRadioButton rbGroesse [];

...

        cb = new JCheckBox [zutaten.length];

        for(int i=0; i < zutaten.length; i++)

        {

            cb [i] = new JCheckBox(zutaten[i]);

            cb [i].setName(zutaten[i]);

            

            checkboxesPanel.add(cb [i]);

        }

...



    public void actionPerformed(ActionEvent evt)

    {

        ...

        cb[i].isSelected();

        ...

        rbGroesse [i].isSelected();

        ...

    }

Danke an alle! Tolles Forum!
 
Eine Frage hätte ich allerdings noch. In meinem Programm rufe ich die Klasse Pizza, mit vorher definierten Konstanten auf. Kann ich dies auf ohne vorher definierte Konstanten tun? Das Problem dabei ist, dass ich nicht weiss wie ich die einzelnen Argumente voneinander trennen kann, da es sich um String-Arrays handelt. Jemand eine Idee, wie man das macht?
 
Pizza kannst du nicht ohne Werte instanzieren, zumindets nicht so wie du den Konstruktor geschrieben hast.

Ob die Werte, die du da verwendest, fix im Quelltext stehen oder irgendwo anders herkommen, macht da keinen Unterschied.

Und was willst du trennen?
Beschreib das bitte genauer, was du vorhast.
 
Hallo,

ich möchte genau diesen Block entfernen:

Code:
private static final String[] GROESSEN = {"klein","normal","gro\u00df"};
    private static final String[] ZUTATEN = {"Artischocken","Paprika","Ei","Spinat","Knoblauch","Mais"};
    private static final double[] GRUNDPREISE = {4,4.5,5};
    private static final double PPZ = 0.6;

Dass ich Pizza nicht ohne Werte aufrufen kann, ist mir klar, nur frage ich mich wie ich die Argumente trennen muss. Wenn ich nur Kommas verwende, dann weiss man doch nicht wo die einen Argumente anfangen und aufhören, schliesslich handelt es sich um Arrays... (String[])

Code:
public Pizza(String titel, String[] zutaten, String[] groessen, double[] grundpreise, double ppz)
 
Zurück