2017-07-05 3 views
-1

Ich muss alle Kinder und Elternfenster schließen, wenn ich ein Fenster in der Hierarchie schließe.Wie alle Kinder und Elternfenster zu schließen?

Ich habe drei Linien von Fenstern:

Meine Fenster Hierarchie - Alle Linien in einem MainWindow starten. Nur LoadPlayers und CreatePlayers sind Dialoge. Alle anderen Fenster sind Frames.

Z.B. Ich schließe TablesOverview in der ersten Zeile - ich muss alle anderen Fenster in dieser Zeile schließen.

Aber Fenster in anderen Linien müssen offen bleiben.

Beachten Sie, dass TablesOverview in zwei Zeilen ist.

Ich kann den Code schreiben, wo ich jedes Fenster nannte, das geschlossen werden muss. Aber ich brauche eine sauberere Lösung.

Dieser Code gibt mir alle geöffneten Fenster - ich weiß nicht, wie man nur Windows in einer Zeile nimmt.

Window[] windows = Window.getWindows(); 

Diese Codes geben mir nichts.

Window[] windows = frame.getOwnedWindows(); 
Component comp = frame.getParent(); 
+0

Mögliche Duplikat [Schließen Sie alle Java-Kind-Sieg dows] (https://stackoverflow.com/questions/29859469/close-all-java-child-windows) –

+0

Willkommen bei Stack Overflow! Bitte [besuchen Sie die Tour] (http://stackoverflow.com/tour), um zu sehen, wie die Seite funktioniert und welche Fragen hier behandelt werden, und bearbeiten Sie Ihre Frage entsprechend.Siehe auch: [So erstellen Sie ein minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) –

+0

Auch aus der Beschreibung scheint diese GUI ein Chaos zu sein. Siehe [Die Verwendung mehrerer JFrames, gute/schlechte Praxis?] (Http://stackoverflow.com/q/9554636/418556) Die Verwendung von zwei Dialogen könnte ein Schritt in die richtige Richtung sein, aber es gibt viele Strategien zum Redesign (um zusätzliche Rahmen zu entfernen), die kombiniert werden können. Siehe meine Antwort auf diese Frage für einen kurzen Überblick über die Alternativen. –

Antwort

-1

Java bietet diese Unterstützung nicht implizit. So müssen Sie um etwas an sich arbeiten:

Lösung:

  • eine neue Klasse erstellen, die extends JFrame
  • ein Datenelement erstellen children vom Typ ArrayList<Your class name>. Dies enthält die vom aktuellen Fenster erstellte Instanz
  • Erstellen Sie eine Elementmethode createChildWindow(). Diese Methode erstellt ein untergeordnetes Fenster und fügt es der Variablen children
  • hinzu. Registrieren Sie sich beim Schließen des Fensters für das Ereignis. Verwenden Sie dazu addWindowListener() und überschreiben Sie public void windowClosing(java.awt.event.WindowEvent windowEvent) Methode. In dieser Methode traverse werfen Sie die children Sammlung und schließen Sie jedes Kind (Dies schließt schließlich auch seine nachfolgenden Kinder).

Im Folgenden ist der komplette Arbeits Code

WindowTracker.java

package com.cse.test.awt; 

import java.awt.FlowLayout; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class WindowTracker extends JFrame 
{ 
    ArrayList<WindowTracker> children; 
    JLabel childrenCount; 

    public WindowTracker() 
    { 
     children = new ArrayList<>(); 
     this.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent arg0) { 
       System.out.println("Closing..." + this.hashCode()); 
       for(WindowTracker child:children) 
       { 
        child.dispatchEvent(new WindowEvent(child, WindowEvent.WINDOW_CLOSING)); 
       } 
       System.out.println("Closed..." + this.hashCode()); 
      } 
     }); 

     this.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
     childrenCount = new JLabel("Children count: 0"); 
     this.add(childrenCount); 
     JButton btn = new JButton("Create new child"); 
     btn.addActionListener(e -> {WindowTracker child = getNewChild();}); 
     this.add(btn); 

     this.setSize(300, 300); 
     this.setTitle("" + this.hashCode()); 
     this.setVisible(true); 
    } 

    public WindowTracker getNewChild() 
    { 
     WindowTracker child = new WindowTracker(); 
     children.add(child); 
     childrenCount.setText("Children count: " + children.size()); 
     return child; 
    } 
} 

Executer.java

package com.cse.test.common; 

import com.cse.test.awt.WindowTracker; 

public class Executer { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     new WindowTracker(); 

    } 

} 
+0

Sie benötigen weder die neue Klasse noch das Datenelement 'ArrayList' oder die zusätzliche Methode. Sie brauchen nur 'JFrame.getContentPane(). GetComponents()'. – EJP

+0

@EJP Es gibt keine untergeordneten Fenster zurück. Es wird die vom Container gehaltene Komponente zurückgeben. Siehe hier: [getComponents()] (https://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#getComponents()) und [getContentPane()] (https: // docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html#getContentPane()). Behalten Sie also die Kinderfenster im Auge, wir brauchen 'ArrayList'. – cse

Verwandte Themen