JFrame sperren

Status
Nicht offen für weitere Antworten.

p3lotud0

Aktives Mitglied
Hi,

habe folgende Problemstellung:

ich besitze einen JFrame, der einen anderen aufruft (durch Button-Klick). Nun möchte ich, dass solange der zweite Frame geöffnet ist, den ersten gesperrt haben.
Habe schon gesucht und Tipps wie mit JDialog-Verwendung etc. gelesen.
Das geht bestimmt, aber ist doch recht umständlich, oder?!?

"JFrame sperren" ist als Titel eigentlich falsch gewählt, weil das weniger ein Problem ist als das Entsperren.
Habe im ActionListener beim JFrame-Aufruf (dem zweiten) einfach das aktuelle Frame auf disable gesetzt gehabt. Damit wäre das Sperren ja gelöst, nur wie mache ich dieses JFrame wieder enable?

Beim Schließen des 2. JF via WindowListener, aber wie greife ich auf das Ursprungsframe zu?
Oder ist das alles nicht das wahre und es gibt noch ne bessere Alternative?

Danke im Voraus

Saludos,

p3lotud0
 

dieta

Top Contributor
Mit einem JDialog ist das eigentlich sehr einfach. Du übergibst ihm einfach als Owner dein Frame.
Dann noch ein setModal(true) und dein Frame wird gesperrt, sobald der Dialog geöffnet wird und wieder freigegeben sobald er wieder geschlossen wird.
 

AlArenal

Top Contributor
Wenn du dem zweiten Frame z.B. im Konstruktor die Referenzen auf den ersten mitgibst, kannst du diese im zweiten Nutzen, um z.B. beim Schließen den ersten wieder zu enablen. Dafür müsstest du einen eigenen Konstruktor schreiben.

Sinnvoller wäre es gleich einen JDIalog zu benutzen, der bringt das von Haus aus mit und wenn du ihn einfach vor #setVisible(true) auf #setModal(true) setzt, musste auch nix mehr sperren, weil so lange eh nix an den JFrame kommt...
 

André Uhres

Top Contributor
Ein modaler Dialog hat auch noch die Eigenschaft, daß er nach seinem Verschwinden wieder an die Stelle zurückkehrt, wo er sichtbar gemacht wurde.
 

p3lotud0

Aktives Mitglied
Vielen Dank für Eure Hilfe.
Mal ne doofe Frage: Als Owner mein JFrame übergeben. Läuft das so ab: JDialog.setOwner(JFrame)? Das ist jetzt das, was ich gefunden habe.
Habe ich nämlich noch nicht mit "gewerkelt".
 

André Uhres

Top Contributor
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JDialog.html#JDialog(java.awt.Frame,%20java.lang.String,%20boolean)
 

p3lotud0

Aktives Mitglied
Hi,

habe es jetzt doch anders gelöst, da ich es mit dem JDialog nicht wirklich richtig hinbekommen habe.
Es funktioniert auch so, wie ich es möchte. Allerdings habe ich Probleme beim Schließen des 2. Frames, denn irgendwie wird dieser Frame zwar geschlossen, aber nicht wirklich beendet.

Code in Frame1:

Code:
if(item.equals("Frame2")){
		    		  	setEnabled(false);
		    		  	JFrame frame2 = new JFrame("Frame2");
		    		  	new JFrameShower(frame2);
		    		  	
		    		  	frame2.addWindowListener(new WindowAdapter(){
		    		  		public void windowClosing(WindowEvent e){
		    		  			setEnabled(true);
		    		  			frame2.dispose();
		    		  		}
		    		  	});
		    		  	
		    	  }

Das ganze passiert beim Drücken eines Buttons: Den aktuellen Frame disable ich und rufe den 2. Frame auf. Statte ihn mit einem WindowListener aus, der auf das Schließen des Fensters reagiert und dann das 1. Frame wieder enabled.
Nur irgendwie funktioniert das dispose nicht, denn wenn ich das Projekt aufrufe und im 1. Frame komplett schließe, sagt mir mein Editor das noch etwas läuft, dass ich dann manuell schließen muss.
Wie Schließe ich das 2. Frame denn korrekt?
 

Wildcard

Top Contributor
dispose schließt einen Frame nicht, sondern macht ihn unsichtbar und gibt resourcen frei.
Beendet wird dein Programm erst wenn System.exit aufgerufen wird.
 
G

Guest

Gast
Ok.
habe im 1. Frame ein this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE).
Das schliesst mir doch im allgemeinen dann alle noch vorhandenen Frames, oder nicht?
Dann muesste das dispose-betroffene Frame doch auch richtig geschlossen werden?!?!
 
G

Guest

Gast
Und mit welchem Befehl kann ich dann das Druecken auf das X realisieren?
Merkwuerdig ist aber, dass selbst wenn ich beim 1.Frame das X druecke, trotzdem etwas nicht richtig geschlossen ist :(
 
G

Guest

Gast
Ok, jetzt scheint es "irgendwie" zu funktionieren. Die Konsole muss ich zwar dennoch 1mal schliessen, aber dabei bleibt es bei mehrmaligen Programmaufrufen hintereinander. Zuvor musste ich fuer jeden Aufruf immer ein eigenes Fenster wieder schliessen. Danke Dir.
 
G

Guest

Gast
Mhmm...

Mir ist jetzt aufgefallen, das ich mit meiner Loesung bezueglich des WindowListeners ein weiteres Problem habe:
Das 1. Frame wird bei Oeffnen des 2. Frame korrekt disabled und beim Schliessen dessen korrekt wieder enabled.

Nun habe ich aber im 2.Frame einen OK-Button, der das 2.Frame auch schliessen bzw. disposen soll. Da es ja jetzt nicht wirklich geschlossen wird, reagiert auch mein WindowListener im 1. Frame nicht mehr und enabled sich wieder.

Nur wie bekomme ich es hin, dass ich dieses "enable" auch durch das Klicken des Buttons im 2. Frame realisieren kann?
Kann ja aus dem 1.Frame schlecht einen ActionListener auf den OK-Button des 2. Frames setzen?!?

Bekommt man das vielleicht durch einen anderen Listener hin, der vielleicht auf das dispose des 2.Frames reagiert?
Sprich, welcher Listener im 1.Frame angewendet auf das 2.Frame registriert ein Klicken des Ok-Buttons oder ein damit ausgeloestes Event?

Vielen vielen Dank schon mal im Voraus fuer Loesungen/-ansaetze.

Saludos

p3lotud0
 

André Uhres

Top Contributor
Du könntest im zweiten Frame den ersten Frame auf "enabled" setzen. Dazu brauchst du lediglich die Referenz vom ersten Frame: diese übergibst du einfach im Konstruktor des zweiten Frames.
 

thE_29

Top Contributor
Also wenn ich zB den JFrame oder JDialog mit setEnabled(false) setze kann ich trotzdem alles anklicken...
 

p3lotud0

Aktives Mitglied
Bei funktioniert das setEnabled(false)...

Was bei mir aber immer noch nicht richtig funktioniert ist das Sperren eines JFrames, wenn ich aus ihm einen anderen JFrame öffne und solange gesperrt bleibt bis ich den zweiten wieder schließe.
Das Sperren/Entsperren gelingt, aber nicht das "Drumherum".
Wie ich in einem anderen Thread schon mal angeschnitten hatte und jetzt hier ausführlich beschreiben möchte, ist folgendes:

Hatte das Sperren/Entsperren so umgesetzt:

FRAME1:
Code:
...
if(item.equals("Frame2")){
                     setEnabled(false);
                     JFrame frame2 = new JFrame("Frame2");
                     new JFrameShower(frame2);
                     
                     frame2.addWindowListener(new WindowAdapter(){
                        public void windowClosing(WindowEvent e){
                           frame2.dispose();
                           setEnabled(true);
                        }

                        public void windowClosed(WindowEvent e){
                           setEnabled(true);
                        }
                     });
                     
               }

Das ganze funktioniert problemlos, wenn ich Frame2 über die bekannten Verfahren schließe, zB. durch das Drücken auf das "X" oder auch, wenn ich im Frame2 dieses mit dem Button "OK" dispose...

Soweit so gut :)

Jetzt kommt das Problem:
Wenn ich jetzt den Button "Frame2" betätige und Frame2 wieder erstelle und öffne und wieder "OK" bestätige, so wird das ganze irgendwie doppelt ausgeführt:

2x Aufruf des ActionListeners, 2x der Aufruf der Methoden, die ich im ActionListener für den "OK"-Button angelegt habe, etc.
Beim dritten Aufruf von Frame2 passiert alles 3mal.

Das Kouriose ist, dass ich beim OK-Button im Frame2 eine SQL-Abfrage ausführe (UPDATE) und habe dieses mal mit System.out anzeigen lassen.
Ich sehe nun, dass zB. beim dritten Aufruf von Frame2 nicht 3mal die gleiche UPDATE-Query ausgeführt wird, sondern hintereinander auch die beiden anderen von den vorherigen Frame2-Aufrufen!?!

Und irgendwie sieht es so aus, dass sich die Datenbankzugriffe potenzial vergrößern, aber das kann ich nicht genau sagen.

Weiss jemand, wo da das Problem liegen könnte? Bin da absolut ratlos :(
 

André Uhres

Top Contributor
p3lotud0 hat gesagt.:
..Wenn ich jetzt den Button "Frame2" betätige und Frame2 wieder erstelle und öffne und wieder "OK" bestätige,
so wird das ganze irgendwie doppelt ausgeführt..
Bei sowas bitte immer ein KSKB machen (siehe dazu "Lies mich" hier links nebendran):
Code:
package gui;
/*
 * FramesDemo.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FramesDemo extends JFrame {
    final private JButton btFrame2;
    final private JToolBar toolbar;
    public FramesDemo() {
        super("Frames Demo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        //JComponents erzeugen:
        toolbar = new JToolBar();
        btFrame2 = new JButton("Frame2");
        //Layout:
        toolbar.add(btFrame2);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        //Listener:
        btFrame2.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                btFrame2ActionPerformed(evt);
            }
        });
    }
    private void btFrame2ActionPerformed(final ActionEvent evt) {
        setEnabled(false);
        new Frame2(this).setVisible(true);
    }
    public static void main(final String args[]) {new FramesDemo().setVisible(true);}
}
class Frame2 extends JFrame{
    final private JFrame parent;
    final private JToolBar toolbar;
    final private JButton btOK;
    public Frame2(JFrame parent){
        super("Frame2");
        this.parent = parent;
        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        setSize(300,200);
        setLocationRelativeTo(parent);
        //JComponents erzeugen:
        toolbar = new JToolBar();
        btOK = new JButton("OK");
        //Layout:
        toolbar.add(btOK);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        //Listeners:
        btOK.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent evt) {
                System.out.println("OK");
                closeFrame();
            }
        });
        addWindowListener(new WindowAdapter() {
            public void windowClosing(final WindowEvent e) {
                closeFrame();
            }
        });
    }
    private void closeFrame() {
        System.out.println("closeFrame");
        parent.setEnabled(true);
        dispose();
    }
}
 

p3lotud0

Aktives Mitglied
Vielen Dank André für deinen super Rat!!

Habe den Fehler gefunden. Wenn ich sage was es war, werde ich sowieso gesteinigt, aber das ist mir jetzt egal :)

Das war ein kleiner Fehler mit großer Wirkung und er ist mir einfach nicht aufgefallen:
Fragt nicht wieso, aber ich habe den OK-Button mit

Code:
static JButton buttonOK = new JButton("OK");

angelegt. Ja ne, ist klar...
Und mir ist es einfach nicht aufgefallen. So kann man sich auch tagelang beschäftigen...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J jframe vorübergehend "sperren" AWT, Swing, JavaFX & SWT 4
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
Paty JFrame anfänger bräuchte hilfestellung AWT, Swing, JavaFX & SWT 7
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
Mausposition relativ zu JFrame bekommen AWT, Swing, JavaFX & SWT 6
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
N CPU Belastung bei offenem JFrame auf fast 100% AWT, Swing, JavaFX & SWT 15
N Knopf ganz oben (JFrame) AWT, Swing, JavaFX & SWT 9
N JFrame löscht alles, wenn groß gemacht AWT, Swing, JavaFX & SWT 9
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
E JFrame resizing AWT, Swing, JavaFX & SWT 2
E Swing Mausposition auf einem JFrame erkennen AWT, Swing, JavaFX & SWT 5
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Tabelle in JFrame einfügen AWT, Swing, JavaFX & SWT 1
VPChief Ein JFrame ohne setUndecorated(true); nicht verschiebbar machen. AWT, Swing, JavaFX & SWT 6
R Swing Hat mein JFrame meinen Component? AWT, Swing, JavaFX & SWT 2
R Swing Design des oberen Balkens in JFrame AWT, Swing, JavaFX & SWT 2
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
R Swing Ein gezeichneten String aus dem JFrame löschen AWT, Swing, JavaFX & SWT 5
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
T JFrame aktualisieren AWT, Swing, JavaFX & SWT 2
T Bilder bei einem JFrame einfügen AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
T JavaFX JFrame verhalten wie JOptionPane (ErrorMessage) AWT, Swing, JavaFX & SWT 1
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
K Grafik in JFrame einpassen AWT, Swing, JavaFX & SWT 3
D Mit Jmenu neue JFrame öffnen AWT, Swing, JavaFX & SWT 2
J BackgroundJPanel passt sich dem JFrame nicht an AWT, Swing, JavaFX & SWT 7
C Swing JFrame ändert Größe AWT, Swing, JavaFX & SWT 0
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
K JFrame bei JUnit Tests AWT, Swing, JavaFX & SWT 2
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
R Swing JPanels auf JFrame auf verfügbaren Platz aufblasen AWT, Swing, JavaFX & SWT 4
JR2205 Swing JxMaps Einbindung Netbeans JFrame AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
MaxG. JFrame Größe ändern AWT, Swing, JavaFX & SWT 16
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
Ghostman1711 JFrame closing AWT, Swing, JavaFX & SWT 3
R Engineklasse mit JFrame AWT, Swing, JavaFX & SWT 4
M Default-WindowListener JFrame entfernen (Stichwort: iconified) AWT, Swing, JavaFX & SWT 4
ms_cikar Jframe zurück zu frame1 AWT, Swing, JavaFX & SWT 14
C Jframe ohne Rahmen AWT, Swing, JavaFX & SWT 3
lumpigerAffe Swing Jframe aktualisieren AWT, Swing, JavaFX & SWT 27
A Swing JFrame neuzeichnen lassen, position neu berechnen lassen? AWT, Swing, JavaFX & SWT 9
R JFrame schließen AWT, Swing, JavaFX & SWT 9
P Swing JFrame minimiert sich bei Doppelklick auf die Titel-Leiste AWT, Swing, JavaFX & SWT 17
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
I JFrame an Bildschirm anpassen AWT, Swing, JavaFX & SWT 1
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
P JFrame schrumpft bei Doppelklick auf die Titelleiste AWT, Swing, JavaFX & SWT 0
G JFrame - manuell Größe verändern AWT, Swing, JavaFX & SWT 6
D JFrame mindestgröße erzwingen AWT, Swing, JavaFX & SWT 2
H Swing JFrame mit JFXPanel NPE bei dispose() AWT, Swing, JavaFX & SWT 6
C Swing Borderlayout im JFrame AWT, Swing, JavaFX & SWT 4
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
G Swing JFrame öffnen bei Pidgin Benachrichtigung AWT, Swing, JavaFX & SWT 5
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
S Kein JFrame unter Mac? AWT, Swing, JavaFX & SWT 8
G Resize JFrame AWT, Swing, JavaFX & SWT 8
J Teiltransparenter JFrame mit Blur-Effekt AWT, Swing, JavaFX & SWT 2
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
M NetBeans JFrame Grundlangen fragen AWT, Swing, JavaFX & SWT 6
I Neues JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 5
S JFrame -> setVisible AWT, Swing, JavaFX & SWT 3
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
I Swing JMenuBar auch unten am JFrame? AWT, Swing, JavaFX & SWT 2
K SplashScreen neben JFrame behalten AWT, Swing, JavaFX & SWT 10
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
T Applet Applet in JFrame einbinden AWT, Swing, JavaFX & SWT 8
V JFrame wird nicht richtig angezeigt! AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
Y Kann man Buttons in einem JFrame rund machen ? AWT, Swing, JavaFX & SWT 2
W Swing Farbige JPanels auf JFrame werden nicht gezeigt. Was mach ich falsch? AWT, Swing, JavaFX & SWT 7
Z Java Draw -JFrame finde nicht die Mitte & höhe, breite AWT, Swing, JavaFX & SWT 7
O Swing JFrame Anzeigeproblem AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben