# Wie mache ich ein JFrame modal



## Jamarilo (18. Aug 2010)

Hallo,

ich bins mal wieder, bin zu meinem nächsten problem gestossen ich habe ein MainFrame und ein subMainFrame. Also man klickt auf ein JButton und das suMainFrame geht auf, jetzt wil ich aber dass, das subMainFrame "modal" ist damit man im Hintergrund nicht auf das MainFrame zugreifen kann

Das Problem hatte hier schon mal jemand und die Lösung dazu war: subMainFrame extends JDialog, damit konnte er dann sein JFrame modal machen, habe ich bei mir versucht klappt aber irgendwie nicht...
Vieleicht wisst ihr wie man das genau muss machen? ???:L

[JAVA=42]public class AbfrageFenster extends JDialog {[/code]

[JAVA=42]class AbfragenListener implements ActionListener {

		public void actionPerformed(ActionEvent e) {

			new AbfrageFenster(owner, true);

		}
	}[/code]


----------



## Michael... (19. Aug 2010)

Zunächst mal ist JDialog zwar auch ein Fenster aber nicht das selbe wie JFrame.
Für die aber ist JDialog die richtige Wahl, da man diesen modal machen kann.
Klick einfach mal auf JDialog in Deinen Code Tags, dann gelangst du zur API Doku in der eigentlich alles beschrieben ist.


----------



## XHelp (19. Aug 2010)

Naja, die Antwort die du gefunden hast, hießt vermutlich: "benutze JDialog *anstatt* JFrame"?
Und zu dem Code... naja, damit deklarierst du eine Klasse die von JDialog ableitet und im 2. Teil implementierst du einen Listener. Worauf wolltest du hinaus?
Wenn du bei JFrames bleiben willst, kannst du auch mit setEnabled(boolean) arbeiten.


----------



## Jamarilo (19. Aug 2010)

Nein es hies wirklich JFrame extends JDialog hier der Link:
http://www.java-forum.org/awt-swing-swt/32961-jframe-modal.html

Also ich wil ja von meinem Hauptfenser ein anderes Fenser aufmachen und solange dieses Fenster offen ist solte man im Hauptfenster nichts machen können. Das mit setEnable(false) habe ich auch schon probiert nur dann verlangert sich mein Problem wie mache ich beim schliesen des subFensters, beim Hauptfenster das setEnable wieder auf "true"....? 

Am Montag hatte ich Schule da hat auch mein Java Lehrer gesagt ich solte JFrame extends JDialog machen damit das geht, aber er wolte mir nicht mehr verraten. Ich dachte ich finde das schon heraus, aber hat bis jetzt nicht geklappt....


----------



## XHelp (19. Aug 2010)

Habe beiden Thread durchgeflogen, aber kein einziges Wort von JFrame extends JDialog gesehen.


----------



## Cola_Colin (19. Aug 2010)

Einmal könntest du es so machen, das kommt ohne JDialog aus:

```
JFrame pseudoDialog = new JFrame();
final JFrame parent = this;
pseudoDialog.addWindowListener(new WindowAdapter() {
	@Override
	public void windowClosing(WindowEvent e) {
			parent.setEnabled(true);
			parent.requestFocus();
	}
}
this.setEnabled(false);
pseudoDialog.setVisible(true);
```

Oder mit einem JDialog:

```
JDialog someDialog = new JDialog(this, true);
someDialog.setVisible(true);
```

Das zweite ist kürzer, aber dazu muss dein modales Fenster eben auf JDialog aufbauen und nicht auf JFrame.


----------



## Michael... (19. Aug 2010)

Jamarilo hat gesagt.:


> Am Montag hatte ich Schule da hat auch mein Java Lehrer gesagt ich solte JFrame extends JDialog machen damit das geht


Naja, es kann niemand verhindern, dass Du Deine Klasse JFrame nennst ;-) Hilft allerdings auch nicht die Aufgabe zu lösen.

Hast Du eigentlich mal - wie von mir empfohlen - einen Blick in die Doku geworfen? Da werden diverse Konstuktoren von JDialog beschrieben z.B.


> public JDialog(Frame owner, boolean modal)
> 
> Creates a dialog with the specified owner Frame, modality and an empty title. If owner is null, a shared, hidden frame will be set as the owner of the dialog.
> ...
> ...


----------



## carolin (19. Aug 2010)

Du kannst auch von JDialog erben und dann mit der Methode setModal arbeiten.


----------



## Jamarilo (19. Aug 2010)

Hi ich danke euch allen für die beiträge, leider komme ich erst morgen dazu mich wieder mit dem Problem auseinander zu setzen.... 

Ich werde auf jedenfall mich noch mit der Doku von JDialog beschäftigen und durchlesen!!!

Und ja @XHelp in dem Forum hat er es nur mal eben am Schluss erwähnt das er das mit extends JDialog gelöst hat.


----------



## Jamarilo (30. Aug 2010)

Hi, ja ihr hatte alle recht ich habe mein Fenster zu JDialog umgewandelt und so funktionierts ich habe jetzt ein "fenster extends JDialog". So kann ich mein fenster Modal machen.

Jetzt habe ich allerdings ein anderes problem da mein Fenster jetzt modal(true) ist, führt mein Button den ich implementiert habe nichts mehr aus, wenn ich das modal ausklammere funktioniert alles wieder...

Ist das so das wenn etwas modal ist kann das modale Fenster auf keine andere Klassen zugreifen oder instanzieren. Also ich glaube nicht dass, das so ist... Vieleicht könnt ihr mir helfen??   ???:L


----------



## XHelp (30. Aug 2010)

Naja, irgendwo wird wohl irgendwas irgendwie nicht richtig gemacht.
Konkretere Antwort könnte man ja zu einem konkretem Code geben...


----------



## Jamarilo (30. Aug 2010)

Ja klar sorry habe ich jetz komplett vergessen.

[JAVA=42]
public class SpeicherFenster extends JDialog {

//Datenfelder ausgelassen

public SpeicherFenster(StartFenster s, ResourceBundle r, Logik l) {

		this.r = r;

		this.logRef = l;

		speicherFenster = new JDialog(s,true);[/code]

in der Variable s übergebe ich die Referenz von der Klasse StarFenster das ein JFrame ist.

im new JDialog(s,true)  sage ich ja das der Eigentümer das StarFenster ist.

[JAVA=42]
	class SpeichernListener implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			System.out.println("Ich war hier");
			if ((textfeld1.getText().equals("") || textfeld2.getText().equals(
					"")) == false) {

				Karte k = new Karte(textfeld1.getText(), textfeld2.getText());
				logRef.karteSpeichern(k);
				logRef.listeAusgeben();
			}

			else {

				JOptionPane.showMessageDialog(null,
						"Bitte schreibe Wörter in die Textfelder!");
				System.out.println("Ich war hier");
			}
		}
	}
}
[/code]

und dies führt er nicht mehr aus weil das JDialog modal ist.


----------



## XHelp (30. Aug 2010)

Wo und wie erstellst du den Dialog? Wo wird zu dem Button der Listener zugewiesen etc. (KSKB wäre schön)
Aber generell:

```
public class SpeicherFenster extends JDialog {
...
  speicherFenster = new JDialog(s,true);
```
Macht kein Sinn, da deine Klasse bereits von JDialog ableitet. Musst also den Superkonstruktor aufrufen.


----------



## Jamarilo (31. Aug 2010)

Also den Dialog erstelle ich in einer anderen Klasse, diese instanziert nur meine Frames und Dialoge
aber das JDialog mache ich hier in der untersten zeile.

[JAVA=42]public class Logik {

	private StartFenster gui;
	private SpeicherFenster spF;  //30.08.2010 ED
	private Datenbank dB;
	private ArrayList[] alleKarteien;
	private AbfrageFenster abF;
	private Karte aktuelleKarte;
	private ArrayList<Karte> aktuelleKartei;

	private int kartei;
	private int kartenZähler;

	public Logik() {
		gui = new StartFenster(this);
		dB = new Datenbank();
		alleKarteien = dB.getAlleKarteien();
		kartei = 0;
		kartenZähler = 0;

	}

	public void listeAusgeben() {
		dB.listeAusgeben();
	}

	//30.08.2010 ED
	public void neuSpeicherFenster(ResourceBundle r){

		//Vielleicht müssen wir SpeicherFenster noch ins Datenfeld schreiben
		spF = new SpeicherFenster(gui,r,this);
	}[/code]

Und hier wird dem Button dem Listener zugewiesen in der Dialog Klasse

[JAVA=42]speichern.addActionListener(new SpeichernListener());[/code]

Also das mit dem super meinst so...

[JAVA=42]super(s,true);
		this.r = r;

		this.logRef = l;

		speicherFenster = new JDialog();[/code]

muss ich bei new JDialog() nicht mehr Parametrisieren...?

ich danke dir für deine Hilfe aber was heisst (KSKB wäre schön)??


----------



## XHelp (31. Aug 2010)

Wenn du mit der Maus auf KSKB fährst, bekommst du die erklärung. Ist eben ein Teil des Programms, den man durch Copy&Paste übernehmen kann und direkt starten, ohne selber noch 100 Klassen dazuzuschreiben und überlegen, wie man den Code zum Laufen bringen könnte.


```
speicherFenster
```
 brauchst du nicht. Dein 
	
	
	
	





```
this
```
 leitet ja bereits von JDialog ab. So erstellst du ja ein JDialog, der einen JDialog erstellt


----------



## Jamarilo (31. Aug 2010)

warum brauche isch das speicherFenster nicht? Ich nachfolgendem code lege ich noch diverse panels auf JDialog da brauche ich diese Variabel.

Mit dem this übergebe ich eine Referenz auf ein andere Klasse von der aus ich Methoden brauche auf die das JDialog zugreiffen muss.

Das mit dem KSKB ist eine gute sache aber in meinem Richtigen Programm habe soooo viele klassen die zusammenhängen das es dann mit einer kleineren Version vieleicht nicht die selbe problemanitk geben wird, oder was meinst du??


----------



## REC (31. Aug 2010)

Sag mal "Jamarilo"

Wieso hast du setEnabled(boolean) nicht benutzt?Geht das nicht?


----------



## Jamarilo (31. Aug 2010)

Ja REC wäre schön wen es so einfach wäre.... 

Also ich glaube ich muss das jetzt mal ein bischen genäuer erläutern, weil ich langsam glaube das was ich vorhabe gar nicht geht...

Ich habe eine Klasse Logik, Datenbank und verschiedene Fenster Klassen.

Was ich versuche zu machen: In der Klasse Logik instanziere ich das HauptFenster, auf dem Hauptfenster drückt man einen Button, der wiederum ruft in der Klasse Logik die methode hervor der das besagte modale JDialog() instanziert... Im Jdialog hat es 2 Textfelder die wenn man die fühlt und danach den Button drück sollte dieser ein neue Klasse Karte erstellen mit diesen 2 Strings vom Textfeld. Danach wird in der Klasse Logik eine methode aufgerufen der diese Karte in eine Array Speichert.

Ich will damit sagen dass, das JDialog im eigentlich sinn nicht vom JFrame instanziert wird, weil alle bespiele im Internet die ich gesehn habe, werden immer von diesem JFrame instanziert, der auch der "owner" ist. 
Ich wolte das aber mit der Klasse Logik alles ein bischen übersichtlicher machen weil man Programm zimlich gross ist.

Ich hoffe man versteh was ich meine...


----------



## XHelp (1. Sep 2010)

Jamarilo hat gesagt.:


> Mit dem this übergebe ich eine Referenz auf ein andere Klasse von der aus ich Methoden brauche auf die das JDialog zugreiffen muss.


Nein, tust du nicht. 
	
	
	
	





```
this
```
 referenziert auf das aktuelle Objekt. Deine Klasse leitet schon von JDialog ab, also ist 
	
	
	
	





```
this
```
 dein JDialog



Jamarilo hat gesagt.:


> ...weil ich langsam glaube das was ich vorhabe gar nicht geht...


Doch, eigentlich sollte es gehen



> Ich wolte das aber mit der Klasse Logik alles ein bischen übersichtlicher machen weil man Programm zimlich gross ist.



Du hast aber glaube ich so ziemlich das Gegenteil erreicht. Logik ist Login und Gui ist Gui... Hast du dir schon mal MVC Pattern angeschaut. Das was ich verstanden habe passt da gut rein.


----------



## Jamarilo (2. Sep 2010)

```
spF = new SpeicherFenster(gui,r,this);
```

Meinst du dieses this ist falsch?
Müsste ich hier die Referenz der Klasse Logik übergeben?


Sorry aber dieser Teil verstehe ich einfach nicht:bahnhof: Was ist denn hier falsch?


```
private ResourceBundle r;

	private Logik logRef;
	
	private StartFenster s;

	public SpeicherFenster(StartFenster s, ResourceBundle r, Logik l) {
		
		super(s, true);
		this.r = r;
		this.s = s;
		this.logRef = l;

		speicherFenster = new JDialog(s,true);
```

Ich erbe zwar JDialog,aber ich muss doch trotzdem ein neues JDialogFenster erstellen mit der dazugehörigen Variable.Ansonsten kann ich ja dieses Fenster nicht einstellen.
Denn wenn ich diese Zeile  "speicherFenster = new JDialog(s,true);" nicht erstelle,wird sie auch im Programm nicht angezeigt.


----------



## XHelp (2. Sep 2010)

Was macht 
	
	
	
	





```
super(s, true);
```
 deiner Meinung nach?


----------



## Jamarilo (3. Sep 2010)

mit super(s,true) überschreibe ich den Konstruktor von JDialog oder?!

Ich weiss das ich irgendwas falsch mache aber ich sehe leider noch nicht was...???:L


----------



## XHelp (3. Sep 2010)

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 6.8 Vererbung
da steht es erklärt.
Mit super() überschreibst du nichts, sondern du rufst auf.


----------



## Jamarilo (3. Sep 2010)

Ja ok mit super() rufe ich in der Oberklasse den Konstruktor auf...  Ja aber in meinem fall bringt mir das gar nichts weil ich ja weiter unten ein "new JDialog" erstelle oder?


----------



## XHelp (3. Sep 2010)

du leistest von der Klasse Complex ab... also welche ist deine Oberklasse.... ?


----------



## Jamarilo (3. Sep 2010)

Omg i leite von der Klasse Complex ab ich hab jetzt absolut den Faden verloren.... ich dachte mit "extends JDialog" ist meine Oberklasse JDialog... :bahnhof:


----------



## XHelp (3. Sep 2010)

Oh, sry. Ich dachte ich bin im anderen Thread  Vergiss das mit der Complex Klasse.
Ja, du leitest von JDialog ab und es ist deine Oberklasse. Also brauchst du nicht extra 
	
	
	
	





```
new JDialog
```
 machen. Du kannst mit 
	
	
	
	





```
this
```
 so umgehen, als wäre es deine Instanz von JDialog.


----------



## Jamarilo (3. Sep 2010)

Da bin ich aber beruhigt... Danke ok das war mir bis jetzt nicht bewust ich habe es in meinem Code bereits geändert. 

Wie könnte es auch anderst sein es gibt noch ein aber mein ActionListener Funktionier immer noch nicht ;(. Muss ich vieleicht etwas grundlegendes machen damit ein Button auf einem Modalem JDialog funktioniert?


----------



## REC (3. Sep 2010)

Also ich kenn mich da auch nicht so aus.

Aber so wie ich verstehe,willst du dieses Fenster (JDialog) öffnen,und darin weiterarbeiten können?Also zum Beispiel,immer wieder wörter eingeben und speichern?

Ich weiss nicht ob das geht,ich habe nämlich dies im Forum hier gefunden.
http://www.java-forum.org/awt-swing...ener-jbutton-funktioniert-jframe-jdialog.html


So wie es aussieht dient ein JDialog nur dazu um etwas darzustellen,nicht um darin weiterzuarbeiten?:autsch:

Also ich kenn mich nicht aus,vielleicht kann eine Experte hier das bestätigen oder korrigieren?


----------



## Jamarilo (4. Sep 2010)

Hi ihr werdets nicht glauben ich habs geschaft ich habe vor meinem ActionListener setVisible(true) gemacht darum hat er den Listener gar nicht mer gelesen. 

Ich kanns kaum glabuen dass es nur so ein kleiner Fehler war, aber ich danke euch allen viel mals....!!!


----------



## REC (5. Sep 2010)

Ja cool auf genau diese Idee bin ich nun auch gekommen

So funktioniert das auch.Habe jetzt nur noch ein Problem.Wenn ich das vordere Fenster wieder schliesse,bleibt das hintere Fenster inaktiv.Wie kann ich das wieder umgehen?

Ist es möglich den x-Schliessknopf rechts oben in der Fensterleiste,"abzufangen".Wenn das möglich wäre könnte ich das nützen,um das hintere Fenster wieder aktiv zu machen.

Ja ich weiss falscher Thread

Ich kopiere diese Antwort in den Thread von Jamarilo wo es ums Modal geht.


----------

