MVC Umsetzungsprobleme

terravotion

Erfahrenes Mitglied
Hallöchen

Wir haben in der Schule letzte Woche das MVC-Prinzip besprochen. Nun ich verstehe das nicht ganz und habe da was versucht umzusetzten:

Ich habe ein GUI mit einem Button, und wenn ich den Klicke ändert die Farbe des Textes und es wir die Anzahl Klicks angezeigt...

Das mit der Farbe wechseln ist kein Problem, aber sobald ich vom KLickListener aus die update() funktion im GUI aufrufe gibz den Fehler ganz unten =)

Nun weiss ich nicht weiter... Bitte helft mir =)

App
Code:
public class App {
    public static void main(String[] args) {
       KlickListener klicker = new KlickListener();
       GUI g = new GUI(klicker);
    }
}

GUI
Code:
public class GUI extends JFrame implements ActionListener{
    public KlickListener klicker;
    JButton knopf = new JButton("Anzahl Klicks: 0");

    public GUI(KlickListener klicker) {
       klicker.addListener(this);
       
       add(knopf);
       knopf.addActionListener(this);
       knopf.addActionListener(new KlickListener());
       
       setVisible(true);
       pack();
       setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent arg0) {
        if(knopf.getForeground() == Color.MAGENTA){
            knopf.setForeground(Color.BLUE);
        }
        else {
            knopf.setForeground(Color.MAGENTA);
        }
    }
    
    public void update(){
        System.out.println(klicker.getKlicks());
    }
}



KlickListener
Code:
public class KlickListener implements ActionListener{
    private int AnzKlicks = 0;
    private GUI g;

    public void actionPerformed(ActionEvent arg0) {
      g.update();
        
    }
    
    public void addListener(GUI g){
        this.g = g;
    }
    
    public int getKlicks(){
        return AnzKlicks;
    }
}

Fehler:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at KlickListener.actionPerformed(KlickListener.java:17)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 
Hallo Hunab-Ku,

mir scheint der Aufbau falsch zu sein. Du hast irgendwie zuviele Wechselbeziehungen. In der Klasse GUI greifst du auf ein Objekt der Klasse KlickListener zu. Wiederum verwendet KlickListner GUI. Überarbeite den Aufbau mal einwenig, so kann das mit dem MVC nicht stimmen.

Dein jetziger Ansatz könnte meines Wissens nur mit statischen Methoden realisiert werden, da halt diese Wechselbeziehung zwischen GUI und KlickListener besteht. Das aber widerspricht dem OOP.


Vg Erdal
 
Ich habs jetzt geschafft... Ich zeig mal den Code bei den Files, die ich geändert habe:


GUI
Code:
public class GUI extends JFrame implements ActionListener{
    public KlickListener model;
    JButton knopf = new JButton("Anzahl Klicks: 0");

    public GUI(KlickListener klicker) {
       
       add(knopf);
       knopf.addActionListener(this);
       
       model = klicker;                   //geändert
       model.addListener(this);       //geändert
       
       knopf.addActionListener(model);   //geändert
       
       setVisible(true);
       pack();
       setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
...

Nun, ich habe mich was das 'hin-und-her' zwischen den Klassen betrifft lediglich an das Beispiel meines Lehrers gehalten...

Ich weiss, dass es jetzt , weiss aber nicht genau warum?


Grüsse,
Hunab
 
Ganz einfach, du hattest vorhin zwar deinen "klicker" an den Construktor übergeben, aber nicht in einer Membervariable gespeichert.

sprich kein:

this.klicker = klicker;


somit war klicker == null in der update Methode
 
Zurück