Swing und MDI mit JInternalFrame

goodcat

Aktives Mitglied
Hi,

ich schreibe gerade eine Anwendung die MDI fähig sein soll und auf dem MVC Pattern aufgebaut ist (jedenfalls versuche ich das).
Ich verwende für die "MainGui" ein JFrame und für die Fenster die sich in dem JFrame öffnen sollen habe ich JInternalFrames benutzt.

Jetzt erstmal die Frage ob das soweit korrekt ist. Oder ob es "schönere" Varianten gibt eine MDI zu programmieren.
JFrame mit JDesktopPane und dann JInternalFrame auf JDesktopPane adden.

So und jetzt muss ich ja um ein JInternalFrame auf dem JFrame anzuzeigen ein JDesktopPane im JFrame hinzufügen und das JInternalFrame dort adden. Aber da gibt es ein Problem denn wenn ich aus einem JInternalFrame ein weiteres JInternalFrame öffnen möchte habe ich ja kein Zugriff mehr auf den JDesktopPane (der sich im JFrame befindet) um dort das neue Fenster zu adden (desktopPane.add())...

Jetzt habe ich gedacht das mir an der Stelle bestimmt das Observer Pattern weiterhelfen könnte, wenn das überhaupt geht bzw. sinnvoll ist?!... Aber wie geht man in solchen fällen am besten vor. Ich möchte nicht unbedingt das JDesktopPane von Klasse zu Klasse weiterreichen und ich glaube das ist auch keine besonders gute Lösung!

Danke
Goodcat
 

goodcat

Aktives Mitglied
Also ich habe jetzt folgendes gemacht um die JnternalFrame auf das JDesktopPane zu adden.

Ich habe das JDesktopPane welches in der View instanziert wird, privat und statisch angelegt:
MainAppView.java
Java:
private static final JDesktopPane desktopPane = new JDesktopPane();

public static JDesktopPane getInstance() {
	return desktopPane;
}

Dann noch einen getter der mir die Instanz des Objektes liefert, also nach dem Singelton Prinzip. Die MainApp (View, Controller, Model).java ist das JFrame welches die ganzen JInternalFrames beinhaltet.

Damit kann ich aus dem gesammten Programm immer auf das JDesktopPane zugreifen und JInternalFrames adden.

Was meint ihr dazu? Ist das so sinnnvol bzw. sauber oder wiederspricht das dem MVC?

Danke Goodcat
 

GUI-Programmer

Top Contributor
Was meint ihr dazu? Ist das so sinnnvol bzw. sauber oder wiederspricht das dem MVC?

Sinnvoll ist es meiner Meinung nach.

Sauber nicht ganz. Ist nicht ein Stil den ich als sauber oder elegant erkären würde, dennoch besser als manch andere Art und Weise, die ich hier im Forum schon erlebt habe, an das Problem zu gehen.

MVC - kommt darauf an, ob die View dein JInternalFram "kennt" und der Controller darauf über die View darauf zugreifen kann.
 

goodcat

Aktives Mitglied
Naja dann bin ich ja einigermaßen froh das die Idee nicht totaler Müll ist :D

Da die View und der Controller getrent sind kennt meine View das neue JInternalFrame nicht. In der View befindet sich ein Button, wenn ich den drücke wird das Ereignis im Controller verarbeitet und es wird ein neues JInteralFrame erstellt. Damit ist dem Controller der MainApp der Controller des JInternalFrames bekannt... Im Controller wird bei mir die View und das Model instanziert.

Also hat jedes JInternalFrame seinen eigenen Controller, View und Model... Ist das so korrekt?

Oder sollte ich das neue JInternalFrame (also den Controller der JInternalFrame) in der View der MainApp erstellen?

Was würdest Du denn als elegant oder sauber bezeichnen, wie würdest Du das lösen?
 
Zuletzt bearbeitet:

GUI-Programmer

Top Contributor
View:
Java:
public class View {
	private Model model;
	private Controller controller;
	protected JInternalFrame internalFrame;
	protected JButton btnOpenInternalFrame;
	//...weitere Komponenten
	public View(Model model) {
		this.model = model;
		controller = new Controller(this, model);
		internalFrame = new JInternalFrame();
		internalFrame.setVisible(false);
		// internalFrame einstellen, konfigurieren, etc.
		// internalFrame hinzufügen
		btnOpenInternalFrame = new JButton("Open the Frame");
		// btnOpenInternalFrame einstellen, konfigurieren, etc.
		btnOpenInternalFrame.addActionListener(controller);
		// weitere Komponenten, etc.
	}
}

Controller:
Java:
public class Controller implements ActionListener /* weitere Listener*/ {
	private View view;
	private Model model;
	public Controller(View view, Model model) {
		this.view = view;
		this.model = model;
	}
	
	@Override
	public void actionPerformed(ActionEvent evt) {
		if(evt.getSource().equals(view.btnOpenInternalFrame)) {
			view.internalFrame.setVisible(true);
		}
	}
}

Für mehr Informationen zum Thema MVC siehe mein Beispiel aus meiner Signatur.
 

goodcat

Aktives Mitglied
Aha ok das heisst Du erstellst den Controller und das Model in der View? Das habe ich so nocht nicht gesehen.
Und das JinternalFrame in der View zu instanzieren umgeht natürlich das Problem mit dem adden auf die JDesktopPane. Ausser ich möchte aus einem JInternalFrame ein weiteres JInternalFrame erstellen und das war ja mein anfängliches Problem.

Verstehe ich das richtig das es für jedes JInternalFrame was instanziert wird es nur den einen Controller und das eine Model gibt?
Denn ich hatte mir das so überlegt für jedes JInternalFrame einen extra Controller und Model zu bauen.

Da es eine MDI Anwendung werden soll interessiert es mich natürlich ob für jedes JInternalFrame ein komplet neuer Controller und Model zu erstellen ist.
 

GUI-Programmer

Top Contributor
Verstehe ich das richtig das es für jedes JInternalFrame was instanziert wird es nur den einen Controller und das eine Model gibt?
Denn ich hatte mir das so überlegt für jedes JInternalFrame einen extra Controller und Model zu bauen.

Nein nicht unbedingt nur einen Controller, war nur in meinen Beispiel so. Wenn es be deinen Fall sinnvoller ist mehrere Controller zu besitzen, dann spricht da auch nichts dagegen. Schließlich beinhaltet MVC nur eine kompplette Trennung von den Bereichen, also in Java am besten durch benutzen von vers. Klassen für jeden Bereich. Was nicht heißt, das jeder Bereich nur "eine Klasse groß ist".

Und Übrigens, das Model wird nicht in der View instanziert. Sondern bei der ausführbaren Klasse. Die erzeugte Instanz wird an der View bei deren Erstellung über den Konstruktor übergeben.

Ausser ich möchte aus einem JInternalFrame ein weiteres JInternalFrame erstellen und das war ja mein anfängliches Problem

Mein erster Gedanke wäre bei sowas ne ArrayList<JInternalFrame> in der View zu haben. Danach nach Belieben hinzufügen und entfernen.
 
Zuletzt bearbeitet:

goodcat

Aktives Mitglied
Und Übrigens, das Model wird nicht in der View instanziert. Sondern bei der ausführbaren Klasse. Die erzeugte Instanz wird an der View bei deren Erstellung über den Konstruktor übergeben.

Oh ja stimmt, hätte ich mir mal etwas genauer den Konstruktor anschauen sollen :)

Eine ArrayList<JInternalFrame> in der MainAppView... mh aber dann hab ich ja immernoch das Problem das ich irgendwie auf die Liste zugreifen muss... Eine ArrayLIst in der View und eine Methode die das entsprechene JInternalFrame an den Desktop added, oder sowas in der Art ???:L

Müsste dann ja statisch sein, damit ich von überall darauf zugreifen kann?!
 

GUI-Programmer

Top Contributor
Eine ArrayLIst in der View und eine Methode die das entsprechene JInternalFrame an den Desktop added, oder sowas in der Art ???:L!

Ja genau, so in etwa.

Müsste dann ja statisch sein, damit ich von überall darauf zugreifen kann?!

Nee auf gar keinen Fall statisch. Bei MVC braucht doch eh nur die View und der Controller was von den JInternalFrames zu wissen. Beim Erstellen von neuen JInternalFrames musst du halt View & Controller mit übergeben.
 

goodcat

Aktives Mitglied
Mh ok dann werde ich mir den Code nochmal genauer anschauen.

Was genau für ein MVC Pattern hast Du denn gepostet? Also es gibt ja verschiedene Varianten so wie ich das verstanden habe.
 

bERt0r

Top Contributor
Also ich versteh das Problem hier nicht. Du hast einen Frame. In dem Frame liegt eine DesktopPane. Im DesktopPane liegen Internalframes. Wenn deine Internalframes eigene Klassen sind, die eine Methode haben z.B "openNewInternalFrame()", dann musst du der Internalframeklasse eben eine Referenz der DesktopPane übergeben, z.B im Konstruktor. Mit MVC hat das ganze nicht wirklich was zu tun, was wäre denn hier das Model?
[Edit]Es gibt sogar die funktion getDesktopPane bei InternalFrames, die genau das macht[/Edit]
 

goodcat

Aktives Mitglied
Moin,

also ein Problem git es eigentlich nicht mehr.
Ich hatte fragen zur Struktur bei einer MDI Anwendung die das MVC Pattern benutzen soll.
Denn um ein JInternalFrame anzuzeigen muss es ja dem JDesktopPane geadded werden und da hatte ich fragen wie dies zu gestalten ist wenn aus einem JInternalFrame ein weites JInternalFrame geöffnet werden soll.

Es gibt sogar die funktion getDesktopPane bei InternalFrames, die genau das macht

Das ist ja super die Methode kannte ich garnicht :bahnhof:
Dann kann ich mir das übergeben der View oder des Controllers an das JinternalFrame ersparen. Cool Danke! :toll:

Vielen Dank an euch beide!
Goodcat
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3
T Swing Kompatibilitätsproblem zwischen Swing und JavaFX AWT, Swing, JavaFX & SWT 4
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
S (Swing)Vollbild anzeigen unter Linux/Mac AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben