AWT Wie kann ich ein Frame von einem anderen aus beeinflussen?

DingDong

Mitglied
Hallo,
ich bin bei einer Aufgabe zum Thema MVC und Frames schier am verzweifeln. Es soll ein Mosaikspiel programmiert werden.
Bei einem Mausklick auf ein Spielfeld sollen die umgebenden Spielfelder umgedreht werden. Zeitgleich soll in einem
Protokollfenster mit gleichem Mosaikmuster nur das angeklickte Feld umgedreht werden. Ein Beispiel:

Spielfläche:__________ Protokollfläche
1 2 3__________________1 2 3
4 5 6__________________4 5 6
7 8 9__________________7 8 9

Wenn in der Spielfläche die 3 angeklickt wird, sollen die Felder 2, 5 und 6 umgedreht werden. Zeitgleich soll auf der Protokollfläche das
Feld 3 umgedreht werden.
Leider gelingt es mir nicht, bei einem Klick auf das Spielfeld eine Reaktion auf dem Protokollfeld zu erzeugen. Vielleicht habt ihr ja
einen Tipp für mich. Den Code hab ich in gezipptem Format angehängt.

Viele Grüße

Enzo

PS: Die untere Linien hab ich eingefügt, da Leerzeichen nicht angezeigt wurden.
 

Anhänge

  • mosaik.zip
    8,2 KB · Aufrufe: 2

mihe7

Top Contributor
PS: Die untere Linien hab ich eingefügt, da Leerzeichen nicht angezeigt wurden.
Verwende Code-Tags (die drei Punkte neben dem Smiley, dort Code).

Zur Frage (habe mir jetzt Deinen Code nicht angesehen): das Model enthält ja das Mosaik, das Spielfeld zeigt das Model an. Dazu registriert sich das Spielfeld beim Mosaik als Beobachter. Sobald das Mosaik aktualisiert wurde, werden alle registrierten Beobachter über dieses Ereignis informiert. Für die Darstellung des Spielfelds reicht als Ereignis ein einfaches "hey, die Inhalte des Mosaiks haben sich geändert". Für das Protokoll brauchst Du halt noch eine Zusatzinfo "hey, die Inhalte des Mosaiks haben sich geändert, weil der Benutzer das Feld x,y umgedreht hat". Fertig.
 

DingDong

Mitglied
Wenn ich nur wüsste, wie ich dieses
"hey, die Inhalte des Mosaiks haben sich geändert"
und
"hey, die Inhalte des Mosaiks haben sich geändert, weil der Benutzer das Feld x,y umgedreht hat".
in Code übertragen wird bzw. wo mein Fehler liegt.
Das Mosaik wird in diesem Programm nicht in den Modell-Klassen aufgebaut, sondern in 3 Klassen. Eine Klasse erzeugt das Frame, die zweite Klasse ein Panel und die dritte die Spielfelder über Canvas-Objekte.
Folgendes habe ich bis jetzt versucht:

Code:
package programme;

import interfaces.ModelIF;
import klassen.*;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

public class Mosaik extends Frame {

    // C:\Users\vince\Documents\SGD_Kurse\Software_Entwickler\JAV04\Frühlingsblume.PNG

    private Color farbeRueckseite, farbeVorderseite;
    private StatistikModel statistik;
    int raster;
    private ArrayList<Point> pt;
    //private ProtokollFenster protokollFenster;
    private ProtokollFenster protokollFenster;
    private ProtokollModell protokollModell;
    private MosaikModel mosaikModel;
    private MosaikEventHandler eventHandler;
    protected ModelIF protokollIF;

    public Mosaik(int r) {

        pt = new ArrayList<>();

        // Neues Frame für Aufgabe 4
        protokollFenster = new ProtokollFenster(r, true);
        protokollFenster.setLocation(400, 0);// Positionierung des Frames neben dem Spieleframe

        // Spieleparameter
        this.raster = r;
        farbeRueckseite = new Color(230, 30, 50);
        farbeVorderseite = new Color(50, 210, 30);

        //Spielfläche
        FarbMosaik fm = new FarbMosaik(raster, getSize().width, farbeRueckseite, farbeVorderseite);
        statistik = new StatistikModel();
        mosaikModel = new MosaikModel(raster, raster);
        protokollModell = new ProtokollModell(raster, raster, farbeRueckseite, farbeVorderseite);

        fm.getEventHandler().addModel(statistik);

        /*Die nächste Anweisung fügt zwar dem EventHandler das
        * ProtokollModell hinzu, erzeugt leider eine NullpointerE.
        * todo: klasse ProtokollModell so verändern, dass eine Aktion
        *  im ProtokollFenster erzeugt wird*/
        fm.getEventHandler().addModel(protokollModell);

        setVisible(true);
        setSize(300, 300);
        add(fm);

        //dieser Methodenaufruf bewirkt ein Schließen
        //des Frame-Fensters
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing( WindowEvent ev )
            {
                pt = statistik.getPt();
                for (int i = 0; i < pt.size(); i++){
                    System.out.println("Zeile: " + pt.get(i).x + ", Spalte: " + pt.get(i).y);
                }

                System.out.println("Anzahl Versuche: " + pt.size());
                dispose();
                System.exit( 0 );
            }
        });
    }

    public static void main(String[] args) {

        int ra;
        if(args.length == 0)
            ra = 3;
        else
            ra = Integer.parseInt(args[0]);

        Mosaik mkl = new Mosaik(ra);
        int x = mkl.getWidth() + 20; // Abstand zum Spieleframe
    }
}

Ich habe in der Frame-Klasse dem EventHandler aus der Panel_klasse das Modell des Protokoll-Frames über
Code:
 fm.getEventHandler().addModel(protokollModell);
hinzugefügt.
Dadurch sollte bei einem Klick auf ein Spielefeld die action-Methode der Klasse ProtokollModell aufgerufen werden, wobei das entsprechende Protokollfeld umgedreht werden sollte.

Code:
package klassen;

import interfaces.ModelIF;
import interfaces.MosaikIF;

import java.awt.*;

public class ProtokollModell implements ModelIF {

    MosaikIF[][] mObjects;
    Color farbeRueckseite, farbeVorderseite;
    int zeilen, spalten;

    public ProtokollModell(int zeilen, int spalten, Color farbeRueckseite, Color farbeVorderseite) {
        this.zeilen = zeilen;
        this.spalten = spalten;
        this.farbeRueckseite = farbeRueckseite;
        this.farbeVorderseite = farbeVorderseite;
        mObjects = new ProtokollCanvas[zeilen][spalten];
    }

    public void switchNachbarn(int zeile, int spalte) {
        // erste Zeile: Mitte, links, rechts
        invert(zeile,spalte);

    }

    private void invert(int zeile, int spalte) {

        getMObj(zeile, spalte).switchSeite();// für ein MosaikCanvas-Objekt
        System.out.println("ProtokollModell invert");
    }

    @Override
    public void action(int zeile, int spalte) {
        this.invert(zeile, spalte);
        System.out.println("ProtokollModell action");
        System.out.println("Zeile = " + zeile);
        System.out.println("Spalte = " + spalte);
    }

    @Override
    public void putMObj(int zeile, int spalte, MosaikIF mObj) {
        mObjects[zeile][spalte] = mObj;
        System.out.println("ProtokollModell putMObj");
    }

    @Override
    public MosaikIF getMObj(int zeile, int spalte) {
        System.out.println("ProtokollModell getMObj");
        return mObjects[zeile][spalte];
    }
}

Leider bekomme ich bei einem Klick auf ein Spielfeld eine Nullpointer-Exception, da aus irgendeinem Grund, den ich nicht verstehe, das zu übertragende Objekt null ist.
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at klassen.ProtokollModell.invert(ProtokollModell.java:30)
    at klassen.ProtokollModell.action(ProtokollModell.java:36)
    at klassen.MosaikEventHandler.mouseReleased(MosaikEventHandler.java:42)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
    at java.desktop/java.awt.Component.processEvent(Component.java:6401)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Vielen Dank für eure Hilfe und Grüße
Enzo
 

mihe7

Top Contributor
OK, da muss man erstmal halbwegs durchblicken. Das Model implementiert die ModelIF-Schnittstelle und hält Objekte mit MosaikIF-Schnittstelle, die ihrerseits die Schnittstelle zum UI ist.

Das "hey, die Inhalte des Mosaiks haben sich geändert, weil der Benutzer das Feld x,y umgedreht hat" ist also bereits berücksichtigt.

Das ProtokollModel muss sich vom MosaikModel nur dahingehend unterscheiden, dass in action() ein anderer Code ausgeführt wird. Das hast Du bereits.

Was Du auch tun musst: das ProtokollModel beim MosaikEventListener registrieren (addModel()). Das sollte eigentlich alles sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
S Aufteilung von JPanels in einem Frame AWT, Swing, JavaFX & SWT 13
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
A Hintergrund von einem Frame ändern AWT, Swing, JavaFX & SWT 3
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
T Mehrere sich bewegende Objekte in einem Frame AWT, Swing, JavaFX & SWT 14
P Textfelder in einem Frame lassen sich nicht editieren AWT, Swing, JavaFX & SWT 3
A Daten aus einem Frame werden im nächsten nicht gesehen AWT, Swing, JavaFX & SWT 17
T Tabellen Inhalt in einem "anderem Frame" aktuallie AWT, Swing, JavaFX & SWT 7
G Polygonzug in einem Frame zeichnen. Ich raffs nicht AWT, Swing, JavaFX & SWT 4
Kidao Mehrer Panels, mit Buttons in einem Frame abwechselnd laden? AWT, Swing, JavaFX & SWT 3
G Bild und Buttons in einem Frame AWT, Swing, JavaFX & SWT 6
B Zwei "gleiche" Objekte auf einem Frame platzieren AWT, Swing, JavaFX & SWT 2
T Image auf Panel in einem Internal Frame zeichnen AWT, Swing, JavaFX & SWT 5
N Zwei JTables in einem Frame AWT, Swing, JavaFX & SWT 8
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
Kotelettklopfer Frame ändert Farbe nicht AWT, Swing, JavaFX & SWT 12
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
C Swing F5 Taste neu laden auf ganzen Frame AWT, Swing, JavaFX & SWT 9
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
S Tastatur frame nur nur 1 mal öffnen AWT, Swing, JavaFX & SWT 1
T Swing Java-Frame bei Programmstart NICHT im Vordergrund öffnen AWT, Swing, JavaFX & SWT 2
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
T Frame öffnet nicht AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M Internal Frame in den vordergrund AWT, Swing, JavaFX & SWT 4
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
D Buttons erscheinen nicht auf Frame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
P Frame friert ein AWT, Swing, JavaFX & SWT 6
Z Frame mit Rechteck! AWT, Swing, JavaFX & SWT 16
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
M Swing "Frame.setResizable(false);" verschiebt Content? AWT, Swing, JavaFX & SWT 9
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
D Buttons erscheinen nicht auf dem zweiten Frame AWT, Swing, JavaFX & SWT 4
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
BRoll Frame- Video einbinden machbar? AWT, Swing, JavaFX & SWT 6
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
B Frame always on top nur auf anderem Frame AWT, Swing, JavaFX & SWT 9
K Options-Frame integrieren (zum zuschalten und wegschalten wie geht man da ran? AWT, Swing, JavaFX & SWT 7
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
N Swing Endlosschleife blockt Frame AWT, Swing, JavaFX & SWT 11
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
N Swing Frame ungewollt transparent! AWT, Swing, JavaFX & SWT 2
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
Daniel_L Drop von Dateien auf Frame - welche Drop-Location? AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
C LookAndFeel Frame updated nicht vollständig AWT, Swing, JavaFX & SWT 9
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
J 2 Bereiche im Frame komplett nutzen - Welchen Layoutmanager? AWT, Swing, JavaFX & SWT 3
Z Swing JTextfield auf Frame AWT, Swing, JavaFX & SWT 13
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
L Frame Schließen und neustarten AWT, Swing, JavaFX & SWT 4
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
P Frame "always on top" und welche GUI? AWT, Swing, JavaFX & SWT 5
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
J Swing Frame öffnen aus Frame mit JButton AWT, Swing, JavaFX & SWT 2
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
M erstes Frame wartet auf die Auswertung eines zweiten AWT, Swing, JavaFX & SWT 8
J Frame-Steuerelement AWT, Swing, JavaFX & SWT 2
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
F Hintergrundbild im Frame AWT, Swing, JavaFX & SWT 11
S Zeichnen führt zu transparentem Frame AWT, Swing, JavaFX & SWT 6
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
B Frame im Frame? AWT, Swing, JavaFX & SWT 4
C WindowListener Frame AWT, Swing, JavaFX & SWT 8
P klassenübergreifendes Frame AWT, Swing, JavaFX & SWT 6
B Text soll nich über das Frame hinausgehen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben