| | |
| | | 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(); |
| | | } |
| | | } |
| | | } |