Wie mache ich ein JFrame modal

Jamarilo

Mitglied
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]
 
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.
 
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.
 
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....
 
Einmal könntest du es so machen, das kommt ohne JDialog aus:
Java:
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:
Java:
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.
 
Zuletzt bearbeitet:
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.
...
Parameters:
owner - the Frame from which the dialog is displayed
modal - specifies whether dialog blocks user input to other top-level windows when shown. If true, the modality type property is set to DEFAULT_MODALITY_TYPE, otherwise the dialog is modeless.
 
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.

🙂
 
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
 
Naja, irgendwo wird wohl irgendwas irgendwie nicht richtig gemacht.
Konkretere Antwort könnte man ja zu einem konkretem Code geben...
 
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.
 
Wo und wie erstellst du den Dialog? Wo wird zu dem Button der Listener zugewiesen etc. (KSKB wäre schön)
Aber generell:
Java:
  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.
 
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)??
 
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.

Code:
speicherFenster
brauchst du nicht. Dein
Code:
this
leitet ja bereits von JDialog ab. So erstellst du ja ein JDialog, der einen JDialog erstellt
 
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??
 
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... 😱
 
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.
Code:
this
referenziert auf das aktuelle Objekt. Deine Klasse leitet schon von JDialog ab, also ist
Code:
this
dein JDialog

...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.
 
Java:
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?

Java:
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.
 
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
 
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?
 
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:
 
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
Code:
new JDialog
machen. Du kannst mit
Code:
this
so umgehen, als wäre es deine Instanz von JDialog.
 
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?
 
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?
 
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....!!! 🙂
 
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.
 

Zurück
Oben