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