如何关闭所有孩子和父窗口?

时间:2017-07-05 07:01:54

标签: java swing awt

当我关闭层次结构中的一个窗口时,我需要关闭所有子窗口和父窗口。

我有三行窗口:

我的窗口层次结构 - 所有行都以一个MainWindow开头。只有LoadPlayersCreatePlayers是对话框。所有其他窗口都是框架。

E.g。我在第一行关闭TablesOverview - 我需要关闭此行中的所有其他窗口。

但其他行的窗户必须保持打开状态。

请注意,TablesOverview分为两行。

我可以编写代码,在那里我命名每个必须关闭的窗口。但我需要更清洁的解决方案。

此代码为我提供了所有打开的窗口 - 我不知道如何只在一行中使用Windows。

Window[] windows = Window.getWindows();

这些代码什么也没给我。

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

1 个答案:

答案 0 :(得分:-1)

Java不会隐式提供此支持。所以,你必须使用一些解决方法:

解决方案:

  • 创建一个extends JFrame
  • 的新班级
  • 创建children类型的数据成员ArrayList<Your class name>。这包含由当前窗口
  • 创建的实例
  • 创建成员方法createChildWindow()。此方法将创建一个子窗口并将其添加到变量children
  • 关闭窗口时注册活动。为此,请使用addWindowListener()并覆盖public void windowClosing(java.awt.event.WindowEvent windowEvent)方法。在此方法中,遍历抛出children集合并关闭每个子节点(这最终将关闭其后续子节点)。

以下是完整的工作代码

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();

    }

}