sichtbarkeit von checkboxen

liquid08

Mitglied
hey jungs,
hab folgendes problem in der MVC-architektur und komm nicht weiter:

in der klasse view habe ich einen button und mehrere checkboxen. der button soll nun alle checkboxen gleichzeitig aktivieren. habe also alle buttons und checkboxen einem actionlistener zugefügt, welcher von der klasse controller implementiert wird (controller importiert awt.*). wenn ich nun in der methode actionperformed der klasse controller eine if-schleife einbau, die mithilfe der methode checkbox1.isselected (true) die checkbox1 aktivieren solll, bekomm ich die fehlermeldung in eclipse, dass er eben jene checkbox nicht kennt (checkbox1 cannot be resolved). ich weiss nicht, wie ich der klasse controller klarmachen soll, dass die checkbox der klasse view gemeint ist..
ich hoffe mein problem ist verständlich und jemand kann mir helfen 🙂
 
checkbox1.isselected (true) die checkbox1 aktivieren soll
Meinst sicher setSelected(true) ;-)

Zunächst würde ich mir die Frage stellen: Ist das Setzen einzelner oder aller Checkboxen für Controller oder Model interessant?
Nein: dann kann man den ActionListener für den Button innerhalb der Klasse View implementieren, die kennt ja vermutlich alle CheckBoxen
Ja: dann verpasst man der Klasse View eine Methode ala selectAllCheckBoxes(), die man vom Controller aus aufrufen kann und die alle Checks setzt.
 
In verschiedensten Threads habe ich schon Sinn und Unsinn von Controllern in so einer Form in Frage gestellt (den Unsinn eher weniger 😀 ).

Es gäbe prinzipiell mehrere Möglichkeiten. Die (IMHO) "schlechteste" wäre, get-Methoden für die CheckBoxes zu erstellen:
Java:
class Controller implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == view.getCheckBoxA()) { ... }
        if (e.getSource() == view.getCheckBoxB()) { ... }
    }
}



Etwas sinnvoller könnte sein, dem Controller spezielle Methoden für jede CheckBox zu geben, und die mit anonymen Listenern aufzurufen:
Java:
class Controller
{
    void clickedCheckBoxA() { ... }
    void clickedCheckBoxB() { ... }
}

class View
{
    checkBoxA.addActionListener(... actionPerformed(...) { controller.clickedCheckBoxA(); } }
    checkBoxB.addActionListener(... actionPerformed(...) { controller.clickedCheckBoxB(); } }
}


Oder man spart sichsogar das, und macht das, was man in diesen if-Blöcken machen würde, direkt in der actionPerformed eines (anonymen) Listeners, der direkt an die jeweilige CheckBox gehängt wird...

Java:
class View
{
    void init()
    {
        checkBoxA.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                macheA();
            }
        });

        checkBoxB.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                macheB();
            }
        });

Das letzte ist insbesondere dann sinnvoll, wenn in den Methoden ("macheA" ...) nicht viel gemacht wird. Wenn dort also wirklich nur sowas stehen würde wie
Code:
model.setSometingEnabled(true);
dann würde es sich IMHO nicht lohnen, das (wie im zweiten Ansatz) einmal quer durch den Controller zu schleifen. Wenn der Controller aber noch irgendwelche "umfangreicheren" Aufgaben erledigen muss, wäre das zweite wohl besser.


Was davon tatsächlich am besten ist (oder ob man was GANZ anderes machen sollte), hängt vom konkreten Fall ab, aber ... zumindest 3 Ideen hast du ja jetzt 😉
 

Zurück
Oben