MVC Listener Frage

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi, ich bin gerade dabei eine größere Anwendung zu bauen, hab aber gerad ein glaube ich banales Problem, hinter das
ich nicht steige:

Ich benutze das MVC Pattern und erzeuge im Model ein Set<Interface>

Code:
...
...
private Set<Interface> listeners;
...
..
...

Interface:
Code:
package GUI;
import java.util.EventListener;
public interface Interface extends EventListener{
    public void setCalender(int start, int end, int kalwoche);
}


Zuden habe ich im Model noch folgende Methoden
Code:
public void informListeners(int jahr, int monat, int kalwoche){

        System.out.println(listeners.size());    // --> Testweise, gibt immer 0 aus

        for(Interface o : this.listeners){
            o.setCalender(jahr, monat, kalwoche);
        }
    }
    
    public void addListener(Interface t){
       listeners.add(t);
    }

Im Controller stehen folgende Methoden um Listener hinzuzufügen
Code:
....

public void addListenerToModel(Interface l){
         kalender.addListener(l);     //kalender ist ein Modelobjekt
    }
....


Das GUI implementet das Interface und benutzt im Standartkonstruktor die addListenerToModel methode aus Controller
Code:
public class GUI extends javax.swing.JFrame implements Interface {
    terminprojekt.Controller cont;

    public GUI(terminprojekt.Controller c) {
        cont = c;
        [color=red]cont.addListenerToModel(this);[/color]
        this.setVisible(true);
        initComponents();
       
    }

Jetzt habe ich das Problem das im Set im Model kein einziges Interface hinzugefügt wird, trotz dessen ich dies im GUI getan habe.

Kann mir jemand helfen? Hab das Gefühl es ist ein Schusselfehler, da ich das in etlichen kleineren Programmen schon verwendet habe...


Danke
 
Ach ja das Set ist im Standartkonstr. initialisiert, hab ich vergessen zu posten
Code:
public Calender(Jahr j){
       ....
....
....

        listeners = new HashSet<Interface>();
....
....
    }
[/code]
 
dein Code ist nichtssagend,
ich kann problemlos ein Beispiel konstruieren, welches 1 ausgibt,
und keiner ist schlauer als zuvor:

Code:
public class Test
{

    public static void main(String[] args)
    {
        new GUI(new Controller());
    }
}


class GUI
    extends javax.swing.JFrame
    implements Interface
{
    Controller cont;

    public GUI(Controller c)
    {
        cont = c;
        cont.addListenerToModel(this);
        this.setVisible(true);
        initComponents();

        cont.kalender.informListeners(3, 3, 4);
    }

    private void initComponents()
    {
    }

    public void setCalender(int start, int end, int kalwoche)
    {
    }
}


class Controller
{
    Calender kalender = new Calender(new Jahr());

    public void addListenerToModel(Interface l)
    {
        kalender.addListener(l); // kalender ist ein Modelobjekt
    }
}


class Jahr
{

}


class Calender
{
    Set<Interface> listeners;

    public Calender(Jahr j)
    {
        listeners = new HashSet<Interface>();
    }

    public void informListeners(int jahr, int monat, int kalwoche)
    {

        System.out.println(listeners.size()); // gibt 1 aus

        for (Interface o : this.listeners)
        {
            o.setCalender(jahr, monat, kalwoche);
        }
    }

    public void addListener(Interface t)
    {
        listeners.add(t);
    }
}


interface Interface
    extends EventListener
{
    public void setCalender(int start, int end, int kalwoche);
}


vermuteter Fehler bei dir: du hast irgendwo zwei JFrames, zwei Controller oder ähnliches,
und untersuchst falsche Dinge
 
daran geht etwas nicht

cont.kalender.informListeners(3, 3, 4); da das gegen MVC verstöst, aber mein Problem ist halt, wenn ich die Listeners informieren möchte in meinem GUI etwas auszugeben bzw zu änder passiert nix, weil keine listeners im Set sind, obwohl ich sie geadded habe. Und ich habe nur 1 controller und 1 frame.


Code:
 * Created on 24. September 2008, 14:47
 */

package GUI;


import java.io.File;
import javax.swing.JFileChooser;

/**
 *
 * @author  Disrupt3D
 */
public class GUI extends javax.swing.JFrame implements Interface {
    terminprojekt.Controller cont;

    public GUI(terminprojekt.Controller c) {
        cont = c;
        cont.addListenerToModel(this);     <--- Sollte ein Interface im Model zum Set hinzufügen
        this.setVisible(true);
        initComponents();
       
    }


Methode im Controller
Code:
    public void addListenerToModel(Interface l){
         kalender.addListener(l);   --> kalender ist Modelobjekt
    }

Methode im Model

Code:
    public void addListener(Interface t){
       listeners.add(t);
    }
--> added ein Interface zum
ashSet<Interface> listeners



Wenn ich jetzt aber listeners.size() ausführe kommt 0 dabei raus, sodass ich nicht das GUI ansprechen kann.
Vllt is das ein bisschen besser ausgedrückt von mir. Bin mir sicher, dass ich nur 1 controller und 1 frame habe.
 
> Vllt is das ein bisschen besser ausgedrückt von mir.

das war vorher schon sehr klar, deshalb habe ich ein Beispiel gebaut, welches 1 ausgibt,

> Bin mir sicher, dass ich nur 1 controller und 1 frame habe.

es können auch noch zig andere Fehler sein, die ich hier nicht alle aufschreiben/ gar nicht spontan erinnern kann,

wie auch immer, mein Beispiel beweist, dass im bisherigen Code kein Fehler existiert,
es geht nur mit mehr Code voran,
poste idealerweise ein lauffähiges Programm (so wie ich) mit Ausgabe 0
oder mit Anleitung, welchen Button man drücken muss bis Ausgabe 0

-------

noch ein Tipp:
füge Ausgaben ein ala

beim Einfügen
System.out.println("adde Listener, ich bin: "+hashCode()+", size nun: "+size);

später dann
System.out.println("inform irgendwen, ich bin: "+hashCode()+", size: "+size);
 
Bevor ich versuch ein luauffähiges Prog da rauszuschnipseln, hast du vllt schlechte erfahrungen mit MVC und Netbeans GUI Builder den ich verwenden hab? Habs gefühl das liegt daran, da es mit per hand geschreibenen GUIs funktioniert
 
ich persönlich kann dazu nix sagen, ich vermeide solche schlechten Erfahrungen 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben