java,gui,如何在多个弹窗的情况下,点击当前弹窗中的一个按钮“click here to go back”,会关闭所有的界面,然后自动跳转到最初界面,请用代码实现,加注释
时间: 2023-10-01 17:08:21 浏览: 73
可以使用一个静态的 JFrame 类型的变量来存储最初的界面,在需要返回到最初界面时,调用该 JFrame 的 setVisible() 方法,将其设置为可见即可。同时,可以使用一个 List 来存储所有打开的弹窗,当需要关闭所有界面时,遍历该 List,依次调用每个弹窗的 dispose() 方法来关闭弹窗。
下面是一个简单的实现:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
public class MultiWindowDemo {
// 用于存储最初的界面
private static JFrame mainFrame;
// 用于存储打开的所有弹窗
private static List<JFrame> childFrames = new ArrayList<>();
public static void main(String[] args) {
// 创建最初的界面
mainFrame = new JFrame("Main Frame");
JButton openButton = new JButton("Open Child Frame");
openButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 创建新的弹窗
JFrame childFrame = new JFrame("Child Frame");
JButton backButton = new JButton("Click here to go back");
backButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 关闭所有弹窗,返回最初界面
for (JFrame frame : childFrames) {
frame.dispose();
}
mainFrame.setVisible(true);
}
});
childFrame.add(backButton, BorderLayout.CENTER);
childFrame.pack();
childFrame.setLocationRelativeTo(null);
childFrame.setVisible(true);
// 将新的弹窗添加到列表中
childFrames.add(childFrame);
}
});
mainFrame.add(openButton, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setLocationRelativeTo(null);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
}
}
```
在上面的代码中,首先创建了一个最初的界面 mainFrame,并且在界面中添加了一个按钮,用于打开新的弹窗。当用户点击该按钮时,会创建一个新的弹窗 childFrame,并且将其添加到 childFrames 列表中。
在 childFrame 中,又创建了一个按钮 backButton,当用户点击该按钮时,会遍历 childFrames 列表,依次调用每个弹窗的 dispose() 方法来关闭弹窗,并将最初的界面 mainFrame 设置为可见。
需要注意的是,在遍历 childFrames 列表时,不能直接使用 for-each 循环,因为在关闭弹窗时,会修改 childFrames 列表的大小,导致遍历出错。因此,需要使用传统的 for 循环来遍历列表。
另外,需要注意的是,在关闭弹窗时,不能直接调用 setVisible(false) 方法,因为这样只是将弹窗隐藏了起来,并没有将其销毁。因此,需要调用 dispose() 方法来销毁弹窗。
阅读全文