Frame öffnet anderes Frame: Methode auslagern

Status
Nicht offen für weitere Antworten.

UnkiDunki

Bekanntes Mitglied
Hi,

ich habe Umsetzungsprobleme mit dem Auslagern einer Methode, die die Aufgabe hat aus einem Frame "oldFrame" heraus ein neues Frame "newFrame" zu öffnen, sich dabei zu "disablen" und erst beim Schließen des zweiten Frames sich wieder zu "enablen" und sich den Fokus zu holen.
Das Öffnen von Frames aus Frames findet bei mir sehr sehr häufig statt, so dass ich mich dazu entschloss dieses als Methode auszulagern.

Das ganze funktioniert auch, wenn auch nicht wirklich elegant (siehe nächster Codeauszug), allerdings verliere ich durch das Auslagern die Möglichkeit in der Methode
Code:
windowClosing(...
noch zusätzliche Methode aufrufen zu können, die von Klasse zu Klasse natürlich unterschiedlich sein können.


[HIGHLIGHT="Java"]public static void openFrame(final JFrame oldFrame, final JFrame newFrame){

oldFrame.setEnabled(false);

new JFrameShower(newFrame);

newFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(final WindowEvent e) {
newFrame.dispose();
oldFrame.setEnabled(true);
oldFrame.setState(Frame.NORMAL);
oldFrame.requestFocus();
}
});
}[/HIGHLIGHT]


Jemand einen Rat, wie ich dieses trotzdem auslagern kann und trotzdem noch beim Schließen individuelle Methoden aufrufen kann oder lohnt sich das Auslagern eigentlich nicht
und ich sollte z.B. "JFSettings" wie im ersten Quellcode einfach so behandeln:


[HIGHLIGHT="Java"]...
protected void buttonSettingsActionPerformed(ActionEvent evt) {
setEnabled(false);
final JFSettings frame = new JFSettings(this);

new Methods.JFrameShower(frame);
frame.addWindowListener(new WindowAdapter() {
public void windowClosed(final WindowEvent e) {
enableFrame();
// Moeglichkeit zu weiteren Methoden nach Schließen des Frames
}
});
}

private void enableFrame() {
this.setEnabled(true);
this.setState(Frame.NORMAL);
this.requestFocus();
}
...
[/HIGHLIGHT]

Vielen Dank schon mal für eure Anregungen und etwaige Fragen.
 
Zuletzt bearbeitet:

hdi

Top Contributor
Eine Swinganwendung hat immer nur einen einzigen JFrame. Für sekundäre Fenster nehmen wir JDialog

Verständnisfrage dazu:
Weil ein JFrame einen Thread am leben hält, und ein JDialog nicht?

Wenn das stimmt, kann man das ja nicht so pauschal sagen, oder?
Kann ja sein, dass auch mein "Sekundärfenster" nicht beendet werden
soll nur weil ich das "Primäre" schliesse.

Falls das alles nicht zutrifft: Was ist dann der Grund dafür?
 

diggaa1984

Top Contributor
da war hier letztens jemand mit einem Bsp à la:

JFrame für Menu-Screen (initialier Bildschirm zum Starten und Optionen etc. .. ich sag mal fälchschlicherweise "Splashscreen" mit n paar Möglichkeiten zu agieren) .. und beim Starten des Spiels öffnete sich nen neuer JFrame mit dem eigentlichen Spielgeschehen. Der "Splashframe" war dann weg.

Keine Ahnung wie ich das lösen würde, aber was wäre daran "verkehrt"?! :D
 

hdi

Top Contributor
Weiss auch nicht, was das heissen soll "kein Platz mehr in der Anwendung".
Wieso nicht? Man kann ja x JFrames öffnen, und es gibt da auch keine Exceptions oder sonstige Probleme (soweit ich weiss). Also was ist der Design-Grund, das man das halt üblicherweise nicht so tun soll?
 
S

SlaterB

Gast
Design ist die Frage, Design ist die Antwort

kennst du ein anderes Programm welches mehrere Fenster hat?
macht man eben nicht, z.B. schlecht in der Taskleiste anzuklicken

es verbietet dir keiner, aber es verbietet dir auch keiner, gelbe Schrift auf weißen Hintergrund anzuzeigen
 

hdi

Top Contributor
es verbietet dir auch keiner, gelbe Schrift auf weißen Hintergrund anzuzeigen
Man macht das nicht, weil es einen Grund hat: Man kann es schlecht lesen.

z.B. schlecht in der Taskleiste anzuklicken
Ok, das wäre ein Grund, wenn auch ein ziemlich mickriger ;)
Also, was wären denn andere "z.B."?

Versteh mich nich falsch, ich glaub dir. Aber mein Gott, was ist der Grund.
Nur das mit der Taskleiste?
 

UnkiDunki

Bekanntes Mitglied
Erst mal super, dass meine Frage so eine Diskussion zu Tage gebracht hat :)

Eine Swinganwendung hat immer nur einen einzigen JFrame. Für sekundäre Fenster nehmen wir JDialog und für Komponenten, die sich denselben Bildschirmplatz teilen, JTabbedPane oder CardLayout.

Ok... das wusste ich nicht und wird mir mit SlaterB's "mehreren Fenstern in der Taskleiste" auch klar. Es verliert sich wirklich an Übersichtlichkeit und kann dann z.B. je nach Anzahl der Ebenen wirklich auf der Taskleiste "zu viel des Guten" werden.
Würde aber wie einige anderen hier auch noch vielleicht ein, zwei Gründe mehr hören :)

diggaa1984 hat gesagt.:
JFrame für Menu-Screen (initialier Bildschirm zum Starten und Optionen etc. .. ich sag mal fälchschlicherweise "Splashscreen" mit n paar Möglichkeiten zu agieren) .. und beim Starten des Spiels öffnete sich nen neuer JFrame mit dem eigentlichen Spielgeschehen. Der "Splashframe" war dann weg.

Ich nehme an, dass das dann in Ordnung geht, oder? Der "Splashframe" wird ja disposed und damit sichergestellt, dass immer nur noch ein einziges JFrame "geöffnet" ist...

Zurück zu meiner Anfangsfrage:
Wenn ein Fenster ein anderes aufruft und das aufrufende gesperrt werden soll, nehme ich also ein JDialog, wo das Sperren automatisch geschieht und sich auch die Geschichte mit dem Fokus von selbst erledigt.
Im Prinzip bräuchte ich das Aufrufen eines anderen Fensters dann auch nicht "auszulagern", da der Codeaufwand so wesentlich geringer ist und ich dann einfach direkt im aufrufenden Frame beim Schließen des Dialoges eine individuelle Funktion setzen kann ohne mir viel Umstände zu machen. Ist das korrekt?
 

hdi

Top Contributor
[...] nehme ich also ein JDialog, wo das Sperren automatisch geschieht und sich auch die Geschichte mit dem Fokus von selbst erledigt.

Ich weiss ja nicht wie der Default-Konstruktor von JDialog das macht, aber dieses "automatisch sperren" usw. ist einfach der Effekt von Modalität.
Und ein JDialog kann modal sein. Man kann das per setModal(boolean) setzen,
und es gibt auch einen Konstruktor dem du das gleich mitgeben kannst.
Also wie gesagt, das muss nicht unbedingt automatisch so sein. JFrames können halt
nicht modal sein, sie haben diese Eigenschaft einfach nicht.
 

UnkiDunki

Bekanntes Mitglied
Klar, das "automatische Sperren" liegt beim JDialog an seiner Modalität und default wird ein aufrufendes JFrame gesperrt. Soll das nicht geschehen, setzt man setModel auf false;
Werde die ganze Geschichte mal morgen ausprobieren und ob es überhaupt Sinn macht (habe nämlich fast 3-stellig "neue Fenster"-Aufrufe) das ganze auszulagern. Vom Codeumfang und von der Übersichtlichkeit her...
 

UnkiDunki

Bekanntes Mitglied
Stimmt. Allerdings empfiehlt es sich für meine Anwendung doch eher JDialogs zu verwenden. Haben ja genau das Verhalten, was ich haben möchte.

Noch mal zum SplashScreen und der korrekten Anwendung:

Habe in meiner main-Methode einige Dinge, die initialisiert werden, u.a. Datenbankverbindungsaufbau etc.
Diese Initialisierungen benötigen ja einiges an Zeit, die man durch das SplashScreen ja gut überbrücken kann.
Ist es dann korrekt, dass ich die Initialisierungen wie folgt realisiere:

Code:
SplashScreen splash = SplashScreen.getSplashScreen();
		
if(splash!=null){
			Graphics2D g = (Graphics2D)splash.createGraphics();
			Dimension size = splash.getSize();
                        ...
                        init(); // Initialisierungen
                    }
else init(); // Aufruf der Initialisierungen ohne SplashScreen 
...

Ist die Anwendung so korrekt?
 

Ebenius

Top Contributor
Ich will nicht abstreiten, dass in diesem konkreten Beispiel ein JFrame die richtige Wahl ist. Allerdings tummeln sich in diesem Thema einige sehr sonderbare Behauptungen die ich nicht so stehen lassen kann...
Eine Swinganwendung hat immer nur einen einzigen JFrame. Für sekundäre Fenster nehmen wir JDialog und für Komponenten, die sich denselben Bildschirmplatz teilen, JTabbedPane oder CardLayout.
Das ist falsch. Darf ich an dieser Stelle mal an das SDI (Single Document Interface)-Konzept erinnern? Wenn ich in Word mehrere Dokumente aufmache, oder im OpenOffice, oder im Gimp mehrere Bilder, oder im Browser ein neues Fenster öffne, oder ... In all diesen Fällen habe ich für jedes Dokument ein eigenständiges Frame (in Swing JFrame) und keine Dialoge. Bei den Anwendungen oben handelt es sich nicht um Swing-Anwendungen. Wenn es welche wären würden sie jedoch mehrere JFrames benutzen. Die Wikipedia erklärt uns eigentlich ganz gut, wofür wir Dialoge nutzen.

kennst du ein anderes Programm welches mehrere Fenster hat? macht man eben nicht [...]
Mir würden wahrscheinlich hunderte einfallen, alle SDI:
  1. M$ Outlook (jede editierte und jede mit Doppelklick geöffnete Mail ist ein Fenster mit separatem Doppelklick)
  2. Internet Explorer (CTRL+N öffnet ein neues)
  3. Mozilla FireFox (CTRL+N)
  4. Opera (CTRL+N)
  5. sämtliche OpenOffice-Anwendungen
  6. sämtliche M$-Office-Anwendungen
  7. ICQ
  8. Kopete
  9. KDE PIM
  10. Eclipse (Zum Beispiel: Rechtsklick auf ein Projekt, "Open in New Window")
  11. The Gimp (da ist jedes Bild ein Fenster, die Applikation hat zusätzlich ein eigenes)
  12. Acrobat Reader
  13. KPDF
  14. ...
Mehrere Fenster in einer Anwendung zu benutzen, beziehungsweise benutzen zu können, ist inzwischen von der Ausnahme zum Standard geworden.

Ein JDialog erhält übrigens die Applikation ebenso am Leben wie jedes andere java.awt.Window-Derivat (JFrame, JWindow, Window, ...). Window.dispose() sagt dazu:
Note: When the last displayable window within the Java virtual machine (VM) is disposed of, the VM may terminate. See AWT Threading Issues for more information.

Ebenius
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Tja, Auto ist eben immer noch standard. Ein JFrame ist wohl doch benutzerfreundlicher als viele JFrames.
Hängt das nicht doch einfach vom Anwendungsfall ab? Wenn ich zwei PDF-Dokumente öffne und abwechselnd lese, dann habe ich lieber zwei Fenster offen, zwei Einträge in der Taskbar, beides mit ALT-Tab zu wechseln. Was ist daran weniger benutzerfreundlich, wenn ich doch der Benutzer bin und es überaus freundlich finde? ;)

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Frame öffnet nicht AWT, Swing, JavaFX & SWT 1
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
Kotelettklopfer Frame ändert Farbe nicht AWT, Swing, JavaFX & SWT 12
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
C Swing F5 Taste neu laden auf ganzen Frame AWT, Swing, JavaFX & SWT 9
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
S Tastatur frame nur nur 1 mal öffnen AWT, Swing, JavaFX & SWT 1
T Swing Java-Frame bei Programmstart NICHT im Vordergrund öffnen AWT, Swing, JavaFX & SWT 2
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M Internal Frame in den vordergrund AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
D Buttons erscheinen nicht auf Frame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
P Frame friert ein AWT, Swing, JavaFX & SWT 6
Z Frame mit Rechteck! AWT, Swing, JavaFX & SWT 16
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
M Swing "Frame.setResizable(false);" verschiebt Content? AWT, Swing, JavaFX & SWT 9
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
D Buttons erscheinen nicht auf dem zweiten Frame AWT, Swing, JavaFX & SWT 4
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
BRoll Frame- Video einbinden machbar? AWT, Swing, JavaFX & SWT 6
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
B Frame always on top nur auf anderem Frame AWT, Swing, JavaFX & SWT 9
S Aufteilung von JPanels in einem Frame AWT, Swing, JavaFX & SWT 13
K Options-Frame integrieren (zum zuschalten und wegschalten wie geht man da ran? AWT, Swing, JavaFX & SWT 7
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
N Swing Endlosschleife blockt Frame AWT, Swing, JavaFX & SWT 11
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
N Swing Frame ungewollt transparent! AWT, Swing, JavaFX & SWT 2
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
Daniel_L Drop von Dateien auf Frame - welche Drop-Location? AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
C LookAndFeel Frame updated nicht vollständig AWT, Swing, JavaFX & SWT 9
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
J 2 Bereiche im Frame komplett nutzen - Welchen Layoutmanager? AWT, Swing, JavaFX & SWT 3
Z Swing JTextfield auf Frame AWT, Swing, JavaFX & SWT 13
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
L Frame Schließen und neustarten AWT, Swing, JavaFX & SWT 4
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
P Frame "always on top" und welche GUI? AWT, Swing, JavaFX & SWT 5
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
J Swing Frame öffnen aus Frame mit JButton AWT, Swing, JavaFX & SWT 2
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
M erstes Frame wartet auf die Auswertung eines zweiten AWT, Swing, JavaFX & SWT 8
J Frame-Steuerelement AWT, Swing, JavaFX & SWT 2
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
F Hintergrundbild im Frame AWT, Swing, JavaFX & SWT 11
S Zeichnen führt zu transparentem Frame AWT, Swing, JavaFX & SWT 6
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
B Frame im Frame? AWT, Swing, JavaFX & SWT 4
C WindowListener Frame AWT, Swing, JavaFX & SWT 8
P klassenübergreifendes Frame AWT, Swing, JavaFX & SWT 6
B Text soll nich über das Frame hinausgehen AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
S Swing Panelgröße anpassen wenn Frame maximiert wird AWT, Swing, JavaFX & SWT 2
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
A Hintergrund von einem Frame ändern AWT, Swing, JavaFX & SWT 3
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
M Im Frame wird nur die Menüleiste erstellt und nicht die Tabelle? AWT, Swing, JavaFX & SWT 3
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
T Mehrere sich bewegende Objekte in einem Frame AWT, Swing, JavaFX & SWT 14
J "Warte Frame" AWT, Swing, JavaFX & SWT 3
K Swing JDialog aus Frame ausrufen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben