Wie mache ich einem JPanel mein bereits instanziertes Model bekannt

propra

Aktives Mitglied
Hallo zusammen,

ich habe versucht meinem Programm die MVC-Struktur zugrunde zu legen.
Die Klasse ProgrammTest enthält die main-Methode.

Java:
public class ProgrammTest {

	private static ProgrammModel model;
	private static ProgrammView view;
	private static ProgrammController controller;
	
	/**
	 * @param args
	 * Startet die Anwendung
	 */
	public static void main(String[] args) {
		model = new ProgrammModel();
		
		view = new ProgrammView();
		view.createAndShowGUI();
		
		controller = new ProgrammController(view, model);
	}

}

In der Klasse ProgrammView benutze ich ein JPanel, mit welchem ich gerne auf Methoden des Models zugreifen würde. Jetzt würde ich gerne wissen, wie ich an das Model, welches in ProgrammTest instanziiert wurde. Müsste ich es dafür als Einzelstück implementieren? Das wollte ich nämlich eigentlich vermeiden.
Ich weiß nicht, ob es für das Problem relevant ist, was mich aber auch ein wenig irritiert ist, dass die Klasse ProgrammView bei mir auch keine Kenntnis vom Model hat. Kann es sein, dass hier bei mir ein prinzipieller Strukturfehler vorliegt?
 

faetzminator

Gesperrter Benutzer
Die View darf das Model kennen. Also so was ist erlaubt:
Java:
Model m = new Model();
View v = new View(m);
Controller c = new Controller(m, v);
Dann kannst du auch in der View aufs Model zugreifen.
 
A

AwsmDude

Gast
Bei MVC kennt die View in der Regel das Model.
Während das Model die View nur indirekt benachrichtigt (Listener).
Richtig ist es beim Controller. Der kennt sowohl die View als auch das Model. Die View benachrichtigt den Controller wieder indirekt.

Um also auf dein Model in deiner View zugreifen zu können, musst du das Model der View übergeben.
 

propra

Aktives Mitglied
Ich danke Euch und habe das nun korrigiert. Das erste Teil des Problem besteht allerdings immer noch.

Die Klasse ProgrammView kümmert sich um den Aufbau des Fensters. Darin verwende ich unter anderem eine Klasse DrawingArea, die von JPanel erbt, als Zeichenfläche. Um jetzt beim Überschreiben der paintComponent-Methode auf Methoden des Models zugreifen zu können, brauche ich hier ja ebenfalls eine Referenz auf das Model. Ich habe nur leider keine Idee, wie ich das am geschicktesten machen soll.
Hat jemand da einen Tipp?
 

Michael...

Top Contributor
Die View darf -falls nötig - selbstverständlich eine Referenz auf ihr Model an Subkomponenten weiterreichen.
Ich würde mir das aber ganz genau überlegen. Oft reicht es aus, dass die View (die ja letztendlich "Controller" ihrer Subkomponenten ist) bei Änderungsmeldung des Models die notwendigen Werte an die Subkomponente weiterreicht.
 

faetzminator

Gesperrter Benutzer
Hab gerade in den letzten paar Tagen eine kleine App mit Swing und SWT View geschrieben - ich kommt ja sonst nicht aus dem Fat Client Bereich ;) Aber da hab ichs ganz einfach gemacht: Controller hört beim Model und der View. Wenn sich das Model updated, dann leitet dies - falls nötig - der Controller an die View weiter, welche ein repaint macht. Wenn vom GUI ein Command (F*-Taste, Menu, ...) an den Controller geleitet wird, dann updated dieser natürlich wieder ensprechend das Model (welches sich dann wieder beim Controller meldet usw.).
 

propra

Aktives Mitglied
Die View darf -falls nötig - selbstverständlich eine Referenz auf ihr Model an Subkomponenten weiterreichen.
Ich würde mir das aber ganz genau überlegen. Oft reicht es aus, dass die View (die ja letztendlich "Controller" ihrer Subkomponenten ist) bei Änderungsmeldung des Models die notwendigen Werte an die Subkomponente weiterreicht.

Ich glaube, ich weiß immer noch nicht so ganz genau, was du meinst.
Ich werde mal versuchen, so gut es geht, meine Struktur zu abstrahieren, sodass wir hier etwas konkreten Code haben.

ProgrammView
Java:
package view;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;

import model.ProgrammModel;


public class ProgrammView {
	
	private JFrame frame;

	private JScrollPane scrollPaneForDrawingArea;
	private JTabbedPane tabbedPaneForDrawingArea;
	private JPanel rightWindowSide;
	private JSplitPane contentSplitPane;
	private JPanel contentPane;
	private DrawingArea drawingArea;

	private JMenuBar menuBar;
	
	private JMenu menuDatei;
	
	private JMenuItem menuItemNeu;
	private JMenuItem menuItemOeffnen;
	private JMenuItem menuItemSpeichern;
	private JMenuItem menuItemSchliessen;

	private JMenu menuBearbeiten;
	private JMenu submenuHinzufügen;
	private JMenuItem menuItemKreisHinzufuegen;
	private JMenuItem menuItemRechteckHinzufuegen;
	private JMenuItem menuItemPfeilHinzufuegen;
	
	private PetrinetzEditorModel model;
	
	public PetrinetzEditorView(PetrinetzEditorModel model) {
		super();
		this.model = model;
	}


	public void createAndShowGUI() {
		
		frame = new JFrame();
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setContentPane(createContentPane());
		
		frame.setJMenuBar(createMenuBar());
		
		frame.pack();
		frame.setVisible(true);
		
	}


	private JPanel createContentPane() {
		
		// Zeichenfläche innerhalb eines Scroll-Panes
		scrollPaneForDrawingArea = new JScrollPane(createDrawingArea());
				
		// Linkes Element für contentSplitPane
		tabbedPaneForDrawingArea = new JTabbedPane();
		tabbedPaneForDrawingArea.setTabPlacement(JTabbedPane.BOTTOM);
		
		tabbedPaneForDrawingArea.addTab("Tab1", scrollPaneForDrawingArea);
				
		// Rechtes Element für contentSplitPane
		rightWindowSide = new JPanel();
		rightWindowSide.setPreferredSize(new Dimension(150, 300));
		 
		contentSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tabbedPaneForDrawingArea, rightWindowSide);
		
		contentPane = new JPanel();
		contentPane.add(contentSplitPane);
				
		return contentPane;
	}


	private DrawingArea createDrawingArea() {
		// Zeichenfläche fürTabbedPane (linke Bildschirmhälfte)
		drawingArea = new DrawingArea();
		
		return drawingArea;
	}


	private JMenuBar createMenuBar() {
		
		// Dürfte wohl klar sein, was die Methode macht
	}
	

	// Methoden, um die ActionListener durch den Controller zu setzen

}

DrawingArea
Java:
package view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JPanel;

import model.DrawingMode;
import model.ProgrammModel;

public class DrawingArea extends JPanel {

	private ProgrammModel model; // irgendwie muss dies hier initialisiert werden
	
	public DrawingArea() {
		super();
		setPreferredSize(new Dimension(300, 300));
		setBackground(Color.WHITE);
		
	}	
	
	@Override
	protected void paintComponent(Graphics g) {
		
		super.paintComponent(g);
		
		// hier soll auf das Model zugegriffen werden, um evtl. Werte zu erhalten
	}
}

Vom Gefühl her hätte ich jetzt das Model über den Konstruktor von DrawingArea übergeben, aber da hast Du ja von abgeraten. Wie würde ich so etwas sonst machen? Habe nicht ganz verstanden, was du mit
Oft reicht es aus, dass die View (die ja letztendlich "Controller" ihrer Subkomponenten ist) bei Änderungsmeldung des Models die notwendigen Werte an die Subkomponente weiterreicht.
meintest.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Wie mache ich die Variable xyz eindeutig/unique? Java Basics - Anfänger-Themen 20
berserkerdq2 sqllite in Java, wenn ich mache select count(*) ..., erhalte ich dann nur die gezählte Anzahl oder werden auch die Tabellen ausgegeben? Java Basics - Anfänger-Themen 2
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
J Erste Schritte Was mache ich in meinem Code falsch. Java Basics - Anfänger-Themen 3
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
J Was mache ich falsch in meiner Java Anwendung? Java Basics - Anfänger-Themen 11
D Guten Tag mache gerade eine Umschulung zum FiSi war leider jetzt 2 Wochen Krank und wir hatten Prozendurale Programmierung. Java Basics - Anfänger-Themen 3
Z Klassen Error: ';' expected - was mache ich falsch? Java Basics - Anfänger-Themen 4
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
D Wenn ich repaint(); mache, flackert es so stark, das man fast nichts erkennen kann. Java Basics - Anfänger-Themen 11
A Arrays addieren- Was mache ich falsch?? Java Basics - Anfänger-Themen 2
Silvascus Was mache ich falsch? Java Basics - Anfänger-Themen 15
L Variable an andere Klasse weitergeben - Was mache ich falsch? Java Basics - Anfänger-Themen 2
J Klassen Fehler Datei kopieren - was mache ich falsch Java Basics - Anfänger-Themen 19
G mache aus Test nach sortieren estt oder java aajv Java Basics - Anfänger-Themen 5
K Erste Schritte Wie mache ich weiter? (Spiel-Menü) Java Basics - Anfänger-Themen 9
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
A Variablen Was mache Ich falsch? Java Basics - Anfänger-Themen 5
B Klassen Wie mache ich das "the java way"? Java Basics - Anfänger-Themen 4
A was mache ich falsch? Java Basics - Anfänger-Themen 3
J Wie mache ich ein JFrame modal Java Basics - Anfänger-Themen 30
D Wie mache ich das? Java Basics - Anfänger-Themen 2
F Ich raffs nicht! - Wie mache ich ein einfaches Java-window? Java Basics - Anfänger-Themen 54
D Muss ein Applet schreiben was Mittelwerte berechnet nur was mache ich falsch? Java Basics - Anfänger-Themen 11
T Was mache ich hier falsch? Java Basics - Anfänger-Themen 3
H Wie mache ich aus pfad\\unterpfad pfad\unterpfad? Java Basics - Anfänger-Themen 3
S Wie mache ich mir eine universelle Timermethode Java Basics - Anfänger-Themen 20
D Brauche mehr Flexibilität bei der Realisierung und weiss nicht wie ich das mache. Java Basics - Anfänger-Themen 10
D Boolean funktioniert nicht, was mache ich falsch? Java Basics - Anfänger-Themen 6
S Deserialisieren: alle Objekte ausgeben - wie mache ich das? Java Basics - Anfänger-Themen 2
M Wie mache ich einen Eventdispatcher? Java Basics - Anfänger-Themen 9
M Counter erstellen - Was mache ich falsch? Java Basics - Anfänger-Themen 17
Q TextArea - wie mache ich einen Absatz? Java Basics - Anfänger-Themen 9
S Fehler in Javaprogramm, was mache ich falsch? Java Basics - Anfänger-Themen 9
T Button Dis/Enablen - Was mache ich falsch? Java Basics - Anfänger-Themen 3
S Was mache ich falsch? Java Basics - Anfänger-Themen 4
D Pascal'sche Drreieck. was mache ich in der ausgabe flasch? Java Basics - Anfänger-Themen 5
D Was mache ich falsch beim ScrollPane ? Java Basics - Anfänger-Themen 2
T Was mache ich falsch? File klasse. Java Basics - Anfänger-Themen 3
G Fehler: Illegal Expression. Was mache ich falsch? Java Basics - Anfänger-Themen 4
W Was mache ich Falsch?? Java Basics - Anfänger-Themen 4
N Womit mache ich ein menue Java Basics - Anfänger-Themen 2
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
Zrebna Fragen zu einem Klassendiagramm Java Basics - Anfänger-Themen 8
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
F 2x 16bit Werte zu einem 32bit und dann splitten mit 0xb Java Basics - Anfänger-Themen 1
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
F Einem GIT repository ein Projekt hinzufügen Java Basics - Anfänger-Themen 1
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
J Auf einem JLabel Linien Malen Java Basics - Anfänger-Themen 1
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
N Welche Objekte kann man zu einem Set hinzufügen Java Basics - Anfänger-Themen 4
Kumora ArrayIndexOutOfBoundsException bei einem Sortierverfahren Java Basics - Anfänger-Themen 2
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
J Fehlerbehandlung an einem Beispiel Java Basics - Anfänger-Themen 8
I ResultSet aus meiner SQL-Abfrage in einem JTextfield ausgeben. Java Basics - Anfänger-Themen 1
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
S Algorithmus entwicklen, der zu einem gegebenen Datum die Jahreszeit ermittelt Java Basics - Anfänger-Themen 13
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Elemente in einem Array Java Basics - Anfänger-Themen 5
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
berserkerdq2 Wie gebe ich den Pfad zu einer Datei an, die in einem Ordner in Eclipse ist? Java Basics - Anfänger-Themen 1
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
L Gridmuster in einem Array Java Basics - Anfänger-Themen 2
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
X Erste Schritte Hilfe bei einem kleinen Spiel. Java Basics - Anfänger-Themen 19
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
J Zahlen bis zu einem bestimmten Grenzwert ausgeben Java Basics - Anfänger-Themen 11
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
Igig1 Wie lasse ich dir Werte in einem Array zusammenrücken? Java Basics - Anfänger-Themen 4
W Methode, die mit einem Datum arbeitet? Java Basics - Anfänger-Themen 22
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
C Hilfe bei einem Anfängerprojekt Java Basics - Anfänger-Themen 25
U Char zu einem String machen Java Basics - Anfänger-Themen 1
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben