826220679@qq.com
10 天以前 a8a90fd2d5040e66cc66b3da122a7f82561ff6f6
src/window/WelcomeFrame.java
@@ -1,213 +1,237 @@
package window; // 包声明
import java.awt.*; // 导入AWT包
import java.sql.Connection; // 导入数据库连接类
import java.sql.ResultSet; // 导入结果集类
import java.sql.Statement; // 导入SQL语句类
import javax.swing.*; // 导入Swing包
import javax.swing.border.EmptyBorder; // 导入空边框类
import java.util.ResourceBundle; // 导入资源束类
import udptcp.UDPPortAReceiver; // 导入UDP端口A接收器
import udptcp.UDPPortBReceiver; // 导入UDP端口B接收器
import javax.swing.plaf.basic.BasicInternalFrameUI; // 导入基础内部框架UI
package window;
public class WelcomeFrame extends JInternalFrame { // 欢迎框架类
    private static final long serialVersionUID = 1L; // 序列化版本ID
    private ResourceBundle messages; // 消息资源束
    private Connection conn; // 数据库连接
    private Timer statsTimer; // 统计定时器
    private JLabel udpAPacketCountLabel; // UDP端口A包计数标签
    private JLabel udpBPacketCountLabel; // UDP端口B包计数标签
    private JLabel memoryUsageLabel; // 内存使用标签
    private JLabel threadCountLabel; // 线程计数标签
import java.awt.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.ResourceBundle;
import udptcp.UDPPortAReceiver;
import udptcp.UDPPortBReceiver;
import dell_targets.Dell_BaseStation;
import dell_targets.Dell_tag;
import dell_targets.Dell_SystemConfiguration;
    public WelcomeFrame(ResourceBundle messages, Connection conn) { // 构造函数
        super("", true, true, true, true); // 调用父类构造函数,设置标题为空
        this.messages = messages; // 初始化消息资源束
        this.conn = conn; // 初始化数据库连接
public class WelcomeFrame extends JInternalFrame {
    private static final long serialVersionUID = 1L;
    private final ResourceBundle messages;
    private final Connection conn;
    private Timer statsTimer;
    private JLabel memoryUsageLabel;
    private JLabel threadCountLabel;
    private JLabel tagStatsLabel;
    private JLabel baseStationStatsLabel;
    private JLabel dbVersionLabel;
    private JLabel udpAInfoLabel;
    private JLabel udpBInfoLabel;
    public WelcomeFrame(ResourceBundle messages, Connection conn) {
        super("", true, true, true, true);
        this.messages = messages;
        this.conn = conn;
        
        initializeFrame(); // 初始化框架
        setContentPane(createWelcomePanel()); // 设置内容面板
        startStatsTimer(); // 启动统计定时器
        initializeFrame();
        setContentPane(createWelcomePanel());
        startStatsTimer();
    }
    private void initializeFrame() { // 初始化框架方法
        setSize(900, 700); // 设置框架大小
        setLocation(100, 100); // 设置框架位置
        setMaximizable(true); // 设置可最大化
        setIconifiable(true); // 设置可图标化
        setClosable(true); // 设置可关闭
        setBorder(null); // 移除边框
        setVisible(true); // 设置可见
    private void initializeFrame() {
        setSize(900, 700);
        setLocation(100, 100);
        setMaximizable(true);
        setIconifiable(true);
        setClosable(true);
        setBorder(null);
        
        // 移除标题栏
        BasicInternalFrameUI ui = (BasicInternalFrameUI) this.getUI(); // 获取UI组件
        ui.setNorthPane(null); // 移除标题栏
        ((javax.swing.plaf.basic.BasicInternalFrameUI)this.getUI()).setNorthPane(null);
        
        try {
            setMaximum(true); // 尝试最大化窗口
            setMaximum(true);
        } catch (java.beans.PropertyVetoException e) {
            e.printStackTrace(); // 打印异常堆栈
            e.printStackTrace();
        }
        setVisible(true); // 确保框架可见
    }
    private JPanel createWelcomePanel() { // 创建欢迎面板方法
        JPanel panel = new BackgroundPanel(); // 创建背景面板
        panel.setLayout(new BorderLayout()); // 设置边界布局
        panel.setBorder(new EmptyBorder(30, 30, 30, 30)); // 设置空边框
    private JPanel createWelcomePanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(new EmptyBorder(30, 30, 30, 30));
        panel.setBackground(new Color(245, 248, 255));
        
        // 创建标题面板
        JPanel titlePanel = new JPanel(new BorderLayout()); // 创建边界布局面板
        titlePanel.setOpaque(false); // 设置透明
        // 标题面板
        JPanel titlePanel = new JPanel(new BorderLayout());
        titlePanel.setOpaque(false);
        titlePanel.setBorder(new EmptyBorder(0, 0, 30, 0));
        
        JLabel titleLabel = new JLabel(messages.getString("APP_NAME"), SwingConstants.CENTER); // 创建应用名称标签
        titleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 42)); // 设置字体
        titleLabel.setForeground(new Color(25, 25, 112)); // 设置前景色
        titleLabel.setBorder(new EmptyBorder(20, 0, 20, 0)); // 设置空边框
        titleLabel.setOpaque(false); // 设置透明
        JLabel titleLabel = new JLabel(messages.getString("APP_NAME"), SwingConstants.CENTER);
        titleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 42));
        titleLabel.setForeground(new Color(25, 25, 112));
        
        JLabel subtitleLabel = new JLabel(messages.getString("WELCOME_MSG"), SwingConstants.CENTER); // 创建欢迎消息标签
        subtitleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.ITALIC, 22)); // 设置字体
        subtitleLabel.setForeground(new Color(70, 130, 180)); // 设置前景色
        subtitleLabel.setOpaque(false); // 设置透明
        JLabel subtitleLabel = new JLabel(messages.getString("WELCOME_MSG"), SwingConstants.CENTER);
        subtitleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.ITALIC, 22));
        subtitleLabel.setForeground(new Color(70, 130, 180));
        subtitleLabel.setBorder(new EmptyBorder(10, 0, 20, 0));
        
        titlePanel.add(titleLabel, BorderLayout.NORTH); // 添加标题到北部
        titlePanel.add(subtitleLabel, BorderLayout.CENTER); // 添加副标题到中部
        titlePanel.add(titleLabel, BorderLayout.NORTH);
        titlePanel.add(subtitleLabel, BorderLayout.CENTER);
        
        // 创建信息面板
        JPanel infoPanel = new JPanel(new GridLayout(0, 2, 20, 20)); // 创建网格布局面板
        infoPanel.setBorder(new EmptyBorder(30, 50, 30, 50)); // 设置空边框
        infoPanel.setBackground(new Color(255, 255, 255, 180)); // 设置半透明白色背景
        infoPanel.setOpaque(true); // 设置不透明
        // 主信息面板
        JPanel infoPanel = new JPanel(new GridBagLayout());
        infoPanel.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createLineBorder(new Color(200, 220, 240), 2),
            new EmptyBorder(30, 40, 30, 40)
        ));
        infoPanel.setBackground(new Color(255, 255, 255, 255));
        infoPanel.setOpaque(true);
        
        // 添加系统状态信息
        infoPanel.add(createInfoLabel(messages.getString("SYSTEM_STATUS"),
                     messages.getString("RUNNING_NORMAL"),
                     new Color(0, 100, 0))); // 深绿色
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(15, 15, 15, 15);
        gbc.anchor = GridBagConstraints.WEST;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        
        // 添加数据库连接信息
        infoPanel.add(createInfoLabel(messages.getString("DB_CONNECTION"),
                     conn != null ? messages.getString("CONNECTED") : messages.getString("DISCONNECTED"),
                     conn != null ? new Color(0, 100, 0) : Color.RED)); // 连接成功绿色/失败红色
        // 第一列
        gbc.gridx = 0;
        gbc.gridy = 0;
        
        try {
            if (conn != null) { // 检查数据库连接
                try (Statement stmt = conn.createStatement(); // 创建语句
                     ResultSet rs = stmt.executeQuery("SELECT VERSION()")) { // 执行版本查询
                    if (rs.next()) { // 如果有结果
                        infoPanel.add(createInfoLabel(messages.getString("DB_VERSION"),
                                     rs.getString(1),
                                     new Color(25, 25, 112))); // 添加数据库版本
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常
        // 修复1: 初始化标签并设置初始文本
        tagStatsLabel = new JLabel("0 / 0");
        tagStatsLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        infoPanel.add(createInfoRow(messages.getString("TAG_STATS"), tagStatsLabel, new Color(0, 100, 0)), gbc);
        gbc.gridy++;
        baseStationStatsLabel = new JLabel("0 / 0");
        baseStationStatsLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        infoPanel.add(createInfoRow(messages.getString("BASE_STATION_STATS"), baseStationStatsLabel, new Color(0, 100, 0)), gbc);
        gbc.gridy++;
        udpAInfoLabel = new JLabel(Dell_SystemConfiguration.hexport + " - " + messages.getString("RECEIVED_PACKETS") + ": 0");
        udpAInfoLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        infoPanel.add(createInfoRow(messages.getString("UDP_PORT_A"), udpAInfoLabel, new Color(178, 34, 34)), gbc);
        gbc.gridy++;
        udpBInfoLabel = new JLabel(Dell_SystemConfiguration.ascallport + " - " + messages.getString("RECEIVED_PACKETS") + ": 0");
        udpBInfoLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        infoPanel.add(createInfoRow(messages.getString("UDP_PORT_B"), udpBInfoLabel, new Color(178, 34, 34)), gbc);
        gbc.gridy++;
        memoryUsageLabel = new JLabel("0 MB / 0 MB");
        memoryUsageLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        infoPanel.add(createInfoRow(messages.getString("MEMORY_USAGE"), memoryUsageLabel, new Color(148, 0, 211)), gbc);
        // 第二列
        gbc.gridx = 1;
        gbc.gridy = 0;
        threadCountLabel = new JLabel("0");
        threadCountLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        infoPanel.add(createInfoRow(messages.getString("THREAD_COUNT"), threadCountLabel, new Color(148, 0, 211)), gbc);
        gbc.gridy++;
        dbVersionLabel = new JLabel(""); // 初始为空,稍后设置
        dbVersionLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        infoPanel.add(createInfoRow(messages.getString("DB_VERSION"), dbVersionLabel, new Color(25, 25, 112)), gbc);
        gbc.gridy++;
        JLabel dbStatusLabel = new JLabel(conn != null ? messages.getString("CONNECTED") : messages.getString("DISCONNECTED"));
        dbStatusLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        dbStatusLabel.setForeground(conn != null ? new Color(0, 100, 0) : Color.RED);
        infoPanel.add(createInfoRow(messages.getString("DB_STATUS"), dbStatusLabel, new Color(25, 25, 112)), gbc);
        gbc.gridy++;
        JLabel softwareVersionLabel = new JLabel(messages.getString("APP_VERSION"));
        softwareVersionLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        infoPanel.add(createInfoRow(messages.getString("SOFTWARE_VERSION"), softwareVersionLabel, new Color(25, 25, 112)), gbc);
        // 初始化数据库版本
        if (conn != null && dbVersionLabel.getText().isEmpty()) {
            updateDbVersion();
        }
        // 添加当前用户信息
        infoPanel.add(createInfoLabel(messages.getString("CURRENT_USER"),
                     messages.getString("ADMIN"),
                     new Color(25, 25, 112))); // 深蓝色
        // 添加系统时间信息
        infoPanel.add(createInfoLabel(messages.getString("SYSTEM_TIME"),
                     new java.util.Date().toString(),
                     new Color(25, 25, 112))); // 深蓝色
        // 添加UDP端口A统计
        infoPanel.add(createInfoLabel(messages.getString("UDP_PORT_A"), "0", new Color(178, 34, 34))); // 砖红色
        udpAPacketCountLabel = createInfoLabel("", "", new Color(178, 34, 34)); // 创建计数标签
        infoPanel.add(udpAPacketCountLabel); // 添加计数标签
        // 添加UDP端口B统计
        infoPanel.add(createInfoLabel(messages.getString("UDP_PORT_B"), "0", new Color(178, 34, 34))); // 砖红色
        udpBPacketCountLabel = createInfoLabel("", "", new Color(178, 34, 34)); // 创建计数标签
        infoPanel.add(udpBPacketCountLabel); // 添加计数标签
        // 添加内存使用统计
        infoPanel.add(createInfoLabel(messages.getString("MEMORY_USAGE"), "", new Color(148, 0, 211))); // 紫罗兰色
        memoryUsageLabel = createInfoLabel("", "", new Color(148, 0, 211)); // 创建内存标签
        infoPanel.add(memoryUsageLabel); // 添加内存标签
        // 添加线程计数统计
        infoPanel.add(createInfoLabel(messages.getString("THREAD_COUNT"), "", new Color(148, 0, 211))); // 紫罗兰色
        threadCountLabel = createInfoLabel("", "", new Color(148, 0, 211)); // 创建线程标签
        infoPanel.add(threadCountLabel); // 添加线程标签
        // 创建状态面板
        JPanel statsPanel = new JPanel(new GridLayout(1, 4, 15, 15)); // 创建网格布局面板
        statsPanel.setBorder(new EmptyBorder(20, 50, 10, 50)); // 设置空边框
        statsPanel.setOpaque(false); // 设置透明
        // 添加统计盒子
        statsPanel.add(createStatBox(messages.getString("UDP_PORT_A_STAT"), udpAPacketCountLabel)); // UDP端口A统计
        statsPanel.add(createStatBox(messages.getString("UDP_PORT_B_STAT"), udpBPacketCountLabel)); // UDP端口B统计
        statsPanel.add(createStatBox(messages.getString("MEMORY_USAGE_STAT"), memoryUsageLabel)); // 内存使用统计
        statsPanel.add(createStatBox(messages.getString("THREAD_COUNT_STAT"), threadCountLabel)); // 线程计数统计
        
        // 组装主面板
        panel.add(titlePanel, BorderLayout.NORTH); // 添加标题面板到北部
        panel.add(infoPanel, BorderLayout.CENTER); // 添加信息面板到中部
        panel.add(statsPanel, BorderLayout.SOUTH); // 添加状态面板到南部
        panel.add(titlePanel, BorderLayout.NORTH);
        panel.add(infoPanel, BorderLayout.CENTER);
        
        return panel; // 返回面板
        return panel;
    }
    private JLabel createInfoLabel(String title, String value, Color color) { // 创建信息标签方法
        JLabel label = new JLabel("<html><div style='text-align:center;'><b>" + title + "</b><br>" + value + "</div></html>"); // 创建带HTML格式的标签
        label.setFont(new Font(messages.getString("FONT_NAME"), Font.PLAIN, 16)); // 设置字体
        label.setForeground(color); // 设置前景色
        label.setHorizontalAlignment(SwingConstants.CENTER); // 设置水平居中
        label.setVerticalAlignment(SwingConstants.CENTER); // 设置垂直居中
        label.setOpaque(false); // 设置透明
        return label; // 返回标签
    private JPanel createInfoRow(String title, JLabel valueLabel, Color color) {
        JPanel rowPanel = new JPanel(new BorderLayout(10, 0));
        rowPanel.setOpaque(false);
        JLabel titleLabel = new JLabel(title + ":");
        titleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18));
        titleLabel.setForeground(color.darker());
        valueLabel.setForeground(color);
        rowPanel.add(titleLabel, BorderLayout.WEST);
        rowPanel.add(valueLabel, BorderLayout.CENTER);
        // 添加装饰器
        JPanel decorator = new JPanel();
        decorator.setPreferredSize(new Dimension(5, 5));
        decorator.setBackground(color);
        decorator.setOpaque(true);
        rowPanel.add(decorator, BorderLayout.EAST);
        return rowPanel;
    }
    
    private JPanel createStatBox(String title, JLabel valueLabel) { // 创建统计盒子方法
        JPanel boxPanel = new JPanel(new BorderLayout()); // 创建边界布局面板
        boxPanel.setBorder(BorderFactory.createCompoundBorder( // 设置复合边框
            BorderFactory.createLineBorder(new Color(70, 130, 180), 2), // 蓝色边框
            new EmptyBorder(15, 10, 15, 10) // 内边距
        ));
        boxPanel.setBackground(new Color(240, 248, 255, 220)); // 设置半透明背景
        boxPanel.setOpaque(true); // 设置不透明
        JLabel titleLabel = new JLabel(title, SwingConstants.CENTER); // 创建标题标签
        titleLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 18)); // 设置粗体
        titleLabel.setForeground(new Color(25, 25, 112)); // 设置深蓝色
        valueLabel.setFont(new Font(messages.getString("FONT_NAME"), Font.BOLD, 24)); // 设置粗体大字号
        valueLabel.setHorizontalAlignment(SwingConstants.CENTER); // 设置居中
        boxPanel.add(titleLabel, BorderLayout.NORTH); // 添加标题到北部
        boxPanel.add(valueLabel, BorderLayout.CENTER); // 添加值标签到中部
        return boxPanel; // 返回面板
    private void updateDbVersion() {
        if (conn != null) {
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT VERSION()")) {
                if (rs.next()) {
                    dbVersionLabel.setText(rs.getString(1));
                }
            } catch (Exception ex) {
                dbVersionLabel.setText("N/A");
            }
        }
    }
    
    private void startStatsTimer() { // 启动统计定时器方法
        statsTimer = new Timer(1000, e -> { // 创建1秒间隔的定时器
            // 更新UDP数据包计数
            udpAPacketCountLabel.setText(String.valueOf(UDPPortAReceiver.getPacketCount())); // 更新端口A计数
            udpBPacketCountLabel.setText(String.valueOf(UDPPortBReceiver.getPacketCount())); // 更新端口B计数
    private void startStatsTimer() {
        statsTimer = new Timer(1000, e -> {
            // 更新UDP端口A信息
            int packetCountA = (int) UDPPortAReceiver.getPacketCount();
            udpAInfoLabel.setText(Dell_SystemConfiguration.hexport + " - " +
                                 messages.getString("RECEIVED_PACKETS") + ": " + packetCountA);
            // 更新UDP端口B信息
            int packetCountB = (int) UDPPortBReceiver.getPacketCount();
            udpBInfoLabel.setText(Dell_SystemConfiguration.ascallport + " - " +
                                  messages.getString("RECEIVED_PACKETS") + ": " + packetCountB);
            
            // 更新内存使用情况
            Runtime runtime = Runtime.getRuntime(); // 获取运行时实例
            long usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024); // 计算已用内存(MB)
            long maxMemory = runtime.maxMemory() / (1024 * 1024); // 计算最大内存(MB)
            memoryUsageLabel.setText(usedMemory + " " + messages.getString("MB") + " / " + maxMemory + " " + messages.getString("MB")); // 设置内存文本
            Runtime runtime = Runtime.getRuntime();
            long usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024);
            long maxMemory = runtime.maxMemory() / (1024 * 1024);
            memoryUsageLabel.setText(usedMemory + " " + messages.getString("MB") + " / " +
                                    maxMemory + " " + messages.getString("MB"));
            
            // 更新线程数量
            threadCountLabel.setText(String.valueOf(Thread.activeCount())); // 设置活动线程数
            // 更新线程数
            threadCountLabel.setText(String.valueOf(Thread.activeCount()));
            // 更新标签状态
            int onlineTags = Dell_tag.getOnlineLocationTags().size();
            int totalTags = Dell_tag.getLocationTagCount();
            tagStatsLabel.setText(onlineTags + " / " + totalTags);
            // 更新基站状态
            int onlineStations = Dell_BaseStation.getOnlineBaseStations().size();
            int totalStations = Dell_BaseStation.getLocationBaseCount();
            baseStationStatsLabel.setText(onlineStations + " / " + totalStations);
        });
        statsTimer.start(); // 启动定时器
        statsTimer.start();
    }
    
    @Override
    public void dispose() { // 销毁方法
        super.dispose(); // 调用父类销毁
        if (statsTimer != null) { // 检查定时器
            statsTimer.stop(); // 停止定时器
    public void dispose() {
        super.dispose();
        if (statsTimer != null) {
            statsTimer.stop();
        }
    }
}