From a8a90fd2d5040e66cc66b3da122a7f82561ff6f6 Mon Sep 17 00:00:00 2001
From: 826220679@qq.com <826220679@qq.com>
Date: 星期六, 09 八月 2025 23:32:29 +0800
Subject: [PATCH] 优化了欢迎页面

---
 src/window/WelcomeFrame.java |  368 ++++++++++++++++++++++++++++------------------------
 1 files changed, 196 insertions(+), 172 deletions(-)

diff --git a/src/window/WelcomeFrame.java b/src/window/WelcomeFrame.java
index 158957e..1fa4cb4 100644
--- a/src/window/WelcomeFrame.java
+++ b/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();
         }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3