设计题目
现在需要你设计4个颜色不同的窗口,实现如下图的排列:
并且当你关闭一个窗口的时候,其他窗口不关闭;但是如果你点击关闭第一个窗口的时候,其他窗口都关闭。
类的设计
- ColorfulWindowsApp类
这个类是整个应用程序的入口点,负责创建和管理四个不同颜色的窗口,实现一个具有特定布局和视觉效果的应用场景。其主要目标是展示多个彩色窗口,并通过特定的逻辑实现窗口之间的关联,特别是当第一个窗口关闭时,能够同时关闭其他三个窗口。
主要方法和功能实现:
- main方法:窗口尺寸和布局计算:首先确定单个窗口的宽度和高度(windowWidth和windowHeight),然后根据四个窗口的布局计算出整体的宽度和高度(totalWidth和totalHeight)。通过获取屏幕尺寸,计算出四个窗口整体在屏幕中央的起始坐标(startX和startY),为窗口的定位提供基础。
- 窗口创建和设置:对于每个窗口,创建一个JFrame实例并设置其名称,然后创建一个自定义的JPanel子类,重写paintComponent方法来实现特定的颜色填充效果。将面板添加到窗口中,并设置窗口的大小和位置,最后使窗口可见。
例如,对于第一个窗口:
- 创建JFrame实例window1并命名为 “窗口 1”。设置默认关闭操作为不执行任何操作,以避免直接关闭程序。
- 创建一个自定义面板panel1,在paintComponent方法中设置图形颜色为红色,并填充整个面板。
- 将panel1添加到window1,设置窗口大小为windowWidth和windowHeight,并根据计算出的起始坐标startX和startY设置窗口位置。最后使窗口可见。
3.事件处理:为第一个窗口添加一个窗口监听器,当第一个窗口关闭时,执行特定的逻辑。创建一个WindowAdapter匿名内部类作为窗口监听器添加到window1。在重写的windowClosing方法中,依次调用dispose方法关闭其他三个窗口(window2、window3和window4),并使用System.exit(0)退出程序,确保整个应用程序的退出。
- 可视化和用户体验:通过创建四个不同颜色的窗口,为用户提供一个多彩的视觉体验。窗口的名称和颜色填充使每个窗口具有独特的标识,增强了应用程序的吸引力。
- 布局和定位:通过精确的计算和布局,将四个窗口以 2x2 的布局放置在屏幕中央,确保整体布局的美观和协调性。这种布局设计考虑了用户的视觉感受,使窗口在屏幕上的显示更加整齐和有序。
- 事件响应和关联:为第一个窗口添加特定的窗口关闭事件监听器,实现了窗口之间的关联。当第一个窗口关闭时,同时关闭其他三个窗口的设计理念体现了一种整体的应用程序管理逻辑,确保在特定情况下能够统一关闭所有窗口,提高了应用程序的可控性和用户体验。
2.自定义面板类(如panel1、panel2、panel3、panel4)
这些自定义面板类是用于填充每个窗口的内容,通过重写paintComponent方法实现特定的颜色填充效果,为窗口提供可视化的背景。
主要方法和功能实现:
paintComponent方法:继承和重写:重写了JPanel类的paintComponent方法,该方法在面板需要绘制时被自动调用。首先调用父类的paintComponent方法进行默认绘制,然后设置特定的图形颜色,并使用该颜色填充整个面板。
例如,对于panel1:
- 在paintComponent方法中,首先调用super.paintComponent(g)以执行父类的默认绘制操作。
- 设置图形颜色为红色(g.setColor(Color.RED))。
- 使用红色填充整个面板(g.fillRect(0, 0, getWidth(), getHeight())),确保整个面板都被红色填充,为窗口提供红色的背景。
设计理念总结:
- 可视化多彩窗口:创建一个应用程序,展示四个不同颜色的窗口,每个窗口具有特定的颜色填充和独立的名称,以提供一个多彩的视觉效果。
- 窗口布局和定位:通过计算窗口的大小和屏幕尺寸,将四个窗口以 2x2 的布局放置在屏幕中央,确保整体布局的美观和协调性。
- 事件响应:为第一个窗口添加特定的窗口关闭事件监听器,当第一个窗口关闭时,同时关闭其他三个窗口并退出程序,实现了一种特定的窗口关闭逻辑。
- 简洁和高效:这种设计理念采用了重写paintComponent方法的方式,简洁而高效地实现了特定的颜色填充效果。不需要复杂的图形绘制操作,即可为窗口提供美观的背景。
- 可扩展性:如果需要添加更多的窗口或更改窗口的颜色,可以轻松地创建新的自定义面板类或修改现有的面板类,具有较高的可扩展性。
设计原理
.界面布局计算:
- 首先确定单个窗口的大小(windowWidth和windowHeight),然后根据四个窗口的布局计算出整体的宽度和高度(totalWidth和totalHeight)。
- 通过获取屏幕尺寸,计算出四个窗口整体在屏幕中央的起始坐标(startX和startY),以便将窗口居中显示。
2.窗口创建和绘制:
对于每个窗口,创建一个JFrame实例并设置其名称。然后创建一个自定义的JPanel子类,重写paintComponent方法,在该方法中设置特定的颜色并填充整个面板,以实现窗口的颜色效果。
将面板添加到窗口中,并设置窗口的大小和位置,最后使窗口可见。
3.事件处理:
为第一个窗口添加一个WindowAdapter匿名内部类作为窗口监听器,重写windowClosing方法。在这个方法中,当第一个窗口关闭时,依次调用dispose方法关闭其他三个窗口,并使用System.exit(0)退出程序,确保整个应用程序的退出。这样实现了关闭第一个窗口时同时关闭其他窗口的特定逻辑。
设计源码——ColorfulWindowsApp.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
// 命名为 ColorfulWindowsApp,代表多彩窗口应用程序
public class ColorfulWindowsApp {
public static void main(String[] args) {
// 计算单个窗口的宽度和高度
int windowWidth = 400;
int windowHeight = 400;
// 计算四个窗口整体的宽度和高度
int totalWidth = windowWidth * 2;
int totalHeight = windowHeight * 2;
// 获取屏幕尺寸
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// 计算整体居中的起始坐标
int startX = (screenSize.width - totalWidth) / 2;
int startY = (screenSize.height - totalHeight) / 2;
// 创建第一个窗口(红色填充,名称为窗口 1)
JFrame window1 = new JFrame("窗口 1");
// 设置第一个窗口的默认关闭操作为不执行任何操作
window1.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
JPanel panel1 = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
// 调用父类的 paintComponent 方法进行默认绘制
super.paintComponent(g);
// 设置图形颜色为红色
g.setColor(Color.RED);
// 用红色填充整个面板
g.fillRect(0, 0, getWidth(), getHeight());
}
};
// 将红色面板添加到第一个窗口
window1.add(panel1);
// 设置第一个窗口的大小
window1.setSize(windowWidth, windowHeight);
// 设置第一个窗口在屏幕中的位置
window1.setLocation(startX, startY);
// 使第一个窗口可见
window1.setVisible(true);
// 创建第二个窗口(蓝色填充,名称为窗口 2)
JFrame window2 = new JFrame("窗口 2");
JPanel panel2 = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 设置图形颜色为蓝色
g.setColor(Color.BLUE);
// 用蓝色填充整个面板
g.fillRect(0, 0, getWidth(), getHeight());
}
};
// 将蓝色面板添加到第二个窗口
window2.add(panel2);
// 设置第二个窗口的大小
window2.setSize(windowWidth, windowHeight);
// 设置第二个窗口在屏幕中的位置
window2.setLocation(startX + windowWidth, startY);
// 使第二个窗口可见
window2.setVisible(true);
// 创建第三个窗口(绿色填充,名称为窗口 3)
JFrame window3 = new JFrame("窗口 3");
JPanel panel3 = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 设置图形颜色为绿色
g.setColor(Color.GREEN);
// 用绿色填充整个面板
g.fillRect(0, 0, getWidth(), getHeight());
}
};
// 将绿色面板添加到第三个窗口
window3.add(panel3);
// 设置第三个窗口的大小
window3.setSize(windowWidth, windowHeight);
// 设置第三个窗口在屏幕中的位置
window3.setLocation(startX, startY + windowHeight);
// 使第三个窗口可见
window3.setVisible(true);
// 创建第四个窗口(黄色填充,名称为窗口 4)
JFrame window4 = new JFrame("窗口 4");
JPanel panel4 = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 设置图形颜色为黄色
g.setColor(Color.YELLOW);
// 用黄色填充整个面板
g.fillRect(0, 0, getWidth(), getHeight());
}
};
// 将黄色面板添加到第四个窗口
window4.add(panel4);
// 设置第四个窗口的大小
window4.setSize(windowWidth, windowHeight);
// 设置第四个窗口在屏幕中的位置
window4.setLocation(startX + windowWidth, startY + windowHeight);
// 使第四个窗口可见
window4.setVisible(true);
// 为第一个窗口添加窗口监听器,当第一个窗口关闭时,关闭所有窗口
window1.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// 关闭第一个窗口
window1.dispose();
// 关闭第二个窗口
window2.dispose();
// 关闭第三个窗口
window3.dispose();
// 关闭第四个窗口
window4.dispose();
// 退出程序
System.exit(0);
}
});
}
}