当我关闭层次结构中的一个窗口时,我需要关闭所有子窗口和父窗口。
我有三行窗口:
我的窗口层次结构 - 所有行都以一个MainWindow
开头。只有LoadPlayers
和CreatePlayers
是对话框。所有其他窗口都是框架。
E.g。我在第一行关闭TablesOverview
- 我需要关闭此行中的所有其他窗口。
但其他行的窗户必须保持打开状态。
请注意,TablesOverview
分为两行。
我可以编写代码,在那里我命名每个必须关闭的窗口。但我需要更清洁的解决方案。
此代码为我提供了所有打开的窗口 - 我不知道如何只在一行中使用Windows。
Window[] windows = Window.getWindows();
这些代码什么也没给我。
Window[] windows = frame.getOwnedWindows();
Component comp = frame.getParent();
答案 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();
}
}