package xitongshezhi; import javax.swing.*; import java.awt.*; import java.text.SimpleDateFormat; import java.util.Date; import java.io.*; import java.net.*; @SuppressWarnings("serial") public class banbenguanli extends JDialog { private JPanel mainPanel; private JButton closeButton; // 版本信息组件 private JLabel currentVersionLabel; private JLabel versionDateLabel; private JLabel statusTitleLabel; private JLabel statusMessageLabel; private JPanel latestVersionPanel; private JLabel latestVersionLabel; // 按钮组件 private JButton checkUpdateButton; private JButton updateButton; // 进度条组件 private JProgressBar downloadProgressBar; private JLabel progressPercentLabel; // 版本数据 private String currentVersion = "V1.0.0"; private String currentDate = "2025-11-20"; private String latestVersion = "V1.0.1"; private boolean updateAvailable = false; // API配置 private final String UPDATE_CHECK_URL = "http://39.106.210.13:8090/api/wx/findTbUpapp"; private final String LOGIN_URL = "http://39.106.210.13:8090/api/wx/login"; private final String APP_NAME = "发卡app"; private final String LOGIN_USERNAME = "王飞"; private final String LOGIN_PASSWORD = "admin"; private String downloadUrl = ""; private String releaseNotes = ""; private String loginToken = ""; // 颜色定义 private final Color BACKGROUND_COLOR = new Color(15, 28, 48); private final Color CARD_COLOR = new Color(26, 43, 68); private final Color PRIMARY_COLOR = new Color(52, 152, 219); private final Color SECONDARY_COLOR = new Color(46, 204, 113); private final Color WARNING_COLOR = new Color(243, 156, 18); private final Color TEXT_COLOR = new Color(224, 224, 224); private final Color TEXT_LIGHT_COLOR = new Color(160, 200, 255); public banbenguanli(JFrame parent) { super(parent, "版本管理", true); initializeUI(); setupEventListeners(); updateVersionInfo(); } private void initializeUI() { // 设置弹窗属性 - 7寸竖屏 (480x800) setTitle("版本管理"); setSize(480, 800); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setLocationRelativeTo(getParent()); setResizable(false); // 设置不透明背景 getContentPane().setBackground(BACKGROUND_COLOR); // 主面板 mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.setBackground(BACKGROUND_COLOR); mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // 创建版本管理弹窗内容 JPanel versionPanel = createVersionPanel(); mainPanel.add(versionPanel, BorderLayout.CENTER); add(mainPanel); } private JPanel createVersionPanel() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setBackground(CARD_COLOR); panel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(PRIMARY_COLOR, 1), BorderFactory.createEmptyBorder(25, 25, 25, 25) )); // 顶部渐变条 JPanel gradientBar = new JPanel(); gradientBar.setBackground(PRIMARY_COLOR); gradientBar.setPreferredSize(new Dimension(400, 5)); gradientBar.setMaximumSize(new Dimension(400, 5)); gradientBar.setAlignmentX(Component.CENTER_ALIGNMENT); // 标题区域 JPanel headerPanel = new JPanel(); headerPanel.setLayout(new BoxLayout(headerPanel, BoxLayout.Y_AXIS)); headerPanel.setBackground(CARD_COLOR); headerPanel.setAlignmentX(Component.CENTER_ALIGNMENT); // 标题 JLabel titleLabel = new JLabel("版本管理"); titleLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 24)); titleLabel.setForeground(TEXT_COLOR); titleLabel.setAlignmentX(Component.CENTER_ALIGNMENT); // 副标题 JLabel subtitleLabel = new JLabel("UWB人员定位卡发卡机管理系统"); subtitleLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 14)); subtitleLabel.setForeground(TEXT_LIGHT_COLOR); subtitleLabel.setAlignmentX(Component.CENTER_ALIGNMENT); subtitleLabel.setBorder(BorderFactory.createEmptyBorder(5, 0, 25, 0)); headerPanel.add(titleLabel); headerPanel.add(subtitleLabel); // 当前版本卡片 JPanel currentVersionPanel = createCurrentVersionPanel(); // 更新状态区域 JPanel statusPanel = createStatusPanel(); // 下载进度 JPanel progressPanel = createProgressPanel(); // 按钮区域 JPanel buttonPanel = createButtonPanel(); // 关闭按钮 JButton closeBtn = new JButton("关闭"); closeBtn.setFont(new Font("Microsoft YaHei", Font.BOLD, 15)); closeBtn.setBackground(new Color(60, 60, 60)); closeBtn.setForeground(TEXT_COLOR); closeBtn.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(new Color(100, 100, 100), 1), BorderFactory.createEmptyBorder(12, 20, 12, 20) )); closeBtn.setFocusPainted(false); closeBtn.setCursor(new Cursor(Cursor.HAND_CURSOR)); closeBtn.setAlignmentX(Component.CENTER_ALIGNMENT); closeBtn.setMaximumSize(new Dimension(400, 45)); closeBtn.setOpaque(true); closeButton = closeBtn; // 组装所有组件 panel.add(gradientBar); panel.add(Box.createRigidArea(new Dimension(0, 20))); panel.add(headerPanel); panel.add(currentVersionPanel); panel.add(Box.createRigidArea(new Dimension(0, 20))); panel.add(statusPanel); panel.add(Box.createRigidArea(new Dimension(0, 15))); panel.add(progressPanel); panel.add(Box.createRigidArea(new Dimension(0, 20))); panel.add(buttonPanel); panel.add(Box.createRigidArea(new Dimension(0, 15))); panel.add(closeBtn); return panel; } private JPanel createCurrentVersionPanel() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setBackground(new Color(20, 35, 55)); panel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(new Color(80, 80, 80), 1), BorderFactory.createEmptyBorder(20, 20, 20, 20) )); panel.setAlignmentX(Component.CENTER_ALIGNMENT); panel.setMaximumSize(new Dimension(400, 150)); panel.setOpaque(true); // 版本号标签 currentVersionLabel = new JLabel(currentVersion); currentVersionLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 22)); currentVersionLabel.setForeground(Color.WHITE); currentVersionLabel.setBackground(PRIMARY_COLOR); currentVersionLabel.setOpaque(true); currentVersionLabel.setBorder(BorderFactory.createEmptyBorder(10, 25, 10, 25)); currentVersionLabel.setAlignmentX(Component.CENTER_ALIGNMENT); // 版本描述 JLabel versionDescLabel = new JLabel("当前版本"); versionDescLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 14)); versionDescLabel.setForeground(TEXT_LIGHT_COLOR); versionDescLabel.setAlignmentX(Component.CENTER_ALIGNMENT); versionDescLabel.setBorder(BorderFactory.createEmptyBorder(10, 0, 5, 0)); versionDescLabel.setOpaque(true); versionDescLabel.setBackground(new Color(20, 35, 55)); // 更新日期 versionDateLabel = new JLabel("最后更新: " + currentDate); versionDateLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 13)); versionDateLabel.setForeground(TEXT_LIGHT_COLOR); versionDateLabel.setAlignmentX(Component.CENTER_ALIGNMENT); versionDateLabel.setOpaque(true); versionDateLabel.setBackground(new Color(20, 35, 55)); panel.add(currentVersionLabel); panel.add(versionDescLabel); panel.add(versionDateLabel); return panel; } private JPanel createStatusPanel() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setBackground(new Color(20, 35, 55)); panel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(new Color(80, 80, 80), 1), BorderFactory.createEmptyBorder(20, 20, 20, 20) )); panel.setAlignmentX(Component.CENTER_ALIGNMENT); panel.setMaximumSize(new Dimension(400, 150)); panel.setOpaque(true); JPanel contentPanel = new JPanel(); contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); contentPanel.setBackground(new Color(20, 35, 55)); contentPanel.setAlignmentX(Component.CENTER_ALIGNMENT); contentPanel.setOpaque(true); // 状态标题 statusTitleLabel = new JLabel("系统已是最新版本"); statusTitleLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 18)); statusTitleLabel.setForeground(TEXT_COLOR); statusTitleLabel.setAlignmentX(Component.CENTER_ALIGNMENT); statusTitleLabel.setOpaque(true); statusTitleLabel.setBackground(new Color(20, 35, 55)); // 状态消息 statusMessageLabel = new JLabel("您的系统运行的是最新稳定版本,所有功能正常运行。"); statusMessageLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 13)); statusMessageLabel.setForeground(TEXT_LIGHT_COLOR); statusMessageLabel.setAlignmentX(Component.CENTER_ALIGNMENT); statusMessageLabel.setBorder(BorderFactory.createEmptyBorder(10, 0, 15, 0)); statusMessageLabel.setOpaque(true); statusMessageLabel.setBackground(new Color(20, 35, 55)); // 最新版本信息面板 latestVersionPanel = new JPanel(); latestVersionPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); latestVersionPanel.setBackground(new Color(60, 50, 30)); latestVersionPanel.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(WARNING_COLOR, 1), BorderFactory.createEmptyBorder(10, 15, 10, 15) )); latestVersionPanel.setAlignmentX(Component.CENTER_ALIGNMENT); latestVersionPanel.setMaximumSize(new Dimension(350, 40)); latestVersionPanel.setOpaque(true); JLabel latestTextLabel = new JLabel("最新版本: "); latestTextLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 14)); latestTextLabel.setForeground(WARNING_COLOR); latestTextLabel.setOpaque(true); latestTextLabel.setBackground(new Color(60, 50, 30)); latestVersionLabel = new JLabel(latestVersion); latestVersionLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 15)); latestVersionLabel.setForeground(WARNING_COLOR); latestVersionLabel.setOpaque(true); latestVersionLabel.setBackground(new Color(60, 50, 30)); latestVersionPanel.add(latestTextLabel); latestVersionPanel.add(latestVersionLabel); latestVersionPanel.setVisible(false); contentPanel.add(statusTitleLabel); contentPanel.add(statusMessageLabel); contentPanel.add(latestVersionPanel); panel.add(contentPanel); return panel; } private JPanel createProgressPanel() { // 将创建的面板赋值给成员变量 progressPanel progressPanel = new JPanel(); progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.Y_AXIS)); progressPanel.setBackground(CARD_COLOR); progressPanel.setAlignmentX(Component.CENTER_ALIGNMENT); progressPanel.setMaximumSize(new Dimension(400, 60)); progressPanel.setVisible(false); progressPanel.setOpaque(true); // 进度信息 JPanel infoPanel = new JPanel(new BorderLayout()); infoPanel.setBackground(CARD_COLOR); infoPanel.setMaximumSize(new Dimension(400, 25)); infoPanel.setOpaque(true); JLabel downloadingLabel = new JLabel("下载更新..."); downloadingLabel.setFont(new Font("Microsoft YaHei", Font.PLAIN, 13)); downloadingLabel.setForeground(TEXT_LIGHT_COLOR); downloadingLabel.setOpaque(true); downloadingLabel.setBackground(CARD_COLOR); progressPercentLabel = new JLabel("0%"); progressPercentLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 13)); progressPercentLabel.setForeground(TEXT_LIGHT_COLOR); progressPercentLabel.setOpaque(true); progressPercentLabel.setBackground(CARD_COLOR); infoPanel.add(downloadingLabel, BorderLayout.WEST); infoPanel.add(progressPercentLabel, BorderLayout.EAST); // 进度条 - 不透明 downloadProgressBar = new JProgressBar(0, 100); downloadProgressBar.setValue(0); downloadProgressBar.setBackground(Color.WHITE); downloadProgressBar.setForeground(SECONDARY_COLOR); downloadProgressBar.setBorder(BorderFactory.createLineBorder(new Color(200, 200, 200))); downloadProgressBar.setMaximumSize(new Dimension(400, 12)); downloadProgressBar.setOpaque(true); progressPanel.add(infoPanel); progressPanel.add(Box.createRigidArea(new Dimension(0, 8))); progressPanel.add(downloadProgressBar); return progressPanel; } private JPanel createButtonPanel() { JPanel panel = new JPanel(); panel.setLayout(new GridLayout(1, 2, 15, 0)); panel.setBackground(CARD_COLOR); panel.setAlignmentX(Component.CENTER_ALIGNMENT); panel.setMaximumSize(new Dimension(400, 50)); panel.setOpaque(true); // 检查更新按钮 checkUpdateButton = new JButton("检查更新"); checkUpdateButton.setFont(new Font("Microsoft YaHei", Font.BOLD, 14)); checkUpdateButton.setBackground(PRIMARY_COLOR); checkUpdateButton.setForeground(Color.WHITE); checkUpdateButton.setBorder(BorderFactory.createEmptyBorder(12, 0, 12, 0)); checkUpdateButton.setFocusPainted(false); checkUpdateButton.setCursor(new Cursor(Cursor.HAND_CURSOR)); checkUpdateButton.setOpaque(true); // 立即更新按钮 updateButton = new JButton("立即更新"); updateButton.setFont(new Font("Microsoft YaHei", Font.BOLD, 14)); updateButton.setBackground(new Color(128, 128, 128)); updateButton.setForeground(Color.WHITE); updateButton.setBorder(BorderFactory.createEmptyBorder(12, 0, 12, 0)); updateButton.setFocusPainted(false); updateButton.setCursor(new Cursor(Cursor.HAND_CURSOR)); updateButton.setEnabled(false); updateButton.setOpaque(true); panel.add(checkUpdateButton); panel.add(updateButton); return panel; } private void setupEventListeners() { // 关闭按钮 closeButton.addActionListener(e -> { dispose(); }); // 检查更新按钮 checkUpdateButton.addActionListener(e -> { checkForUpdates(); }); // 立即更新按钮 updateButton.addActionListener(e -> { startUpdate(); }); } private void updateVersionInfo() { currentVersionLabel.setText(currentVersion); versionDateLabel.setText("最后更新: " + currentDate); latestVersionLabel.setText(latestVersion); if (updateAvailable) { showUpdateAvailable(); } else { showUpToDate(); } } private void showUpToDate() { statusTitleLabel.setText("系统已是最新版本"); statusMessageLabel.setText("您的系统运行的是最新稳定版本,所有功能正常运行。"); latestVersionPanel.setVisible(false); updateButton.setEnabled(false); updateButton.setBackground(new Color(128, 128, 128)); } private void showUpdateAvailable() { statusTitleLabel.setText("发现新版本"); statusMessageLabel.setText("有新版本可用,建议更新以获得更好的体验和功能。"); latestVersionPanel.setVisible(true); updateButton.setEnabled(true); updateButton.setBackground(SECONDARY_COLOR); } // 简单的 JSON 解析方法 private String extractJsonValue(String json, String key) { try { String searchKey = "\"" + key + "\":"; int startIndex = json.indexOf(searchKey); if (startIndex == -1) return ""; startIndex += searchKey.length(); int endIndex = json.indexOf(",", startIndex); if (endIndex == -1) endIndex = json.indexOf("}", startIndex); if (endIndex == -1) return ""; String value = json.substring(startIndex, endIndex).trim(); // 去除引号 if (value.startsWith("\"") && value.endsWith("\"")) { value = value.substring(1, value.length() - 1); } return value; } catch (Exception e) { return ""; } } private int extractJsonInt(String json, String key) { try { String value = extractJsonValue(json, key); return Integer.parseInt(value); } catch (Exception e) { return -1; } } private String normalizeVersion(String version) { if (version == null || version.trim().isEmpty()) return ""; String normalized = version.trim(); if (!normalized.toUpperCase().startsWith("V")) { normalized = "V" + normalized; } return normalized.replace("v", "V"); } private void checkForUpdates() { // 保存原始按钮状态 String originalText = checkUpdateButton.getText(); // 显示检查中状态 checkUpdateButton.setText("检查中..."); checkUpdateButton.setEnabled(false); statusTitleLabel.setText("检查更新"); statusMessageLabel.setText("正在检查最新版本,请稍候..."); // 使用SwingWorker执行网络请求,避免阻塞UI SwingWorker worker = new SwingWorker() { @Override protected Boolean doInBackground() throws Exception { try { // 构建请求URL String urlStr = UPDATE_CHECK_URL + "?name=" + URLEncoder.encode(APP_NAME, "UTF-8"); URL url = new URL(urlStr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(10000); connection.setReadTimeout(15000); int responseCode = connection.getResponseCode(); if (responseCode == 200) { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // 解析JSON响应(使用简单字符串处理) String jsonResponse = response.toString(); int code = extractJsonInt(jsonResponse, "code"); if (code == 0) { // 提取data对象 int dataStart = jsonResponse.indexOf("\"data\":"); if (dataStart == -1) { throw new Exception("响应中未找到data字段"); } String serverVersionRaw = extractJsonValue(jsonResponse, "version"); String serverVersion = normalizeVersion(serverVersionRaw); String currentVersionNormalized = normalizeVersion(currentVersion); // 比较版本 boolean hasUpdate = !serverVersion.equals(currentVersionNormalized); if (hasUpdate) { latestVersion = serverVersion; downloadUrl = extractJsonValue(jsonResponse, "address"); releaseNotes = extractJsonValue(jsonResponse, "info"); if (releaseNotes.isEmpty()) { releaseNotes = "有新版本可用,建议更新以获得更好的体验和功能。"; } String uptime = extractJsonValue(jsonResponse, "uptime"); if (!uptime.isEmpty()) { currentDate = uptime; } } return hasUpdate; } else { throw new Exception("服务器返回错误代码: " + code); } } else { throw new Exception("HTTP错误代码: " + responseCode); } } catch (Exception e) { e.printStackTrace(); throw e; } } protected void done() { try { updateAvailable = get(); if (updateAvailable) { showUpdateAvailable(); statusMessageLabel.setText("检查完成,发现新版本可用"); } else { showUpToDate(); statusMessageLabel.setText("检查完成,系统已是最新版本"); } // 恢复按钮状态 checkUpdateButton.setText(originalText); checkUpdateButton.setEnabled(true); // 3秒后恢复原消息 Timer restoreTimer = new Timer(3000, e2 -> { if (updateAvailable) { statusMessageLabel.setText(releaseNotes.isEmpty() ? "有新版本可用,建议更新以获得更好的体验和功能。" : releaseNotes); } else { statusMessageLabel.setText("您的系统运行的是最新稳定版本,所有功能正常运行。"); } }); restoreTimer.setRepeats(false); restoreTimer.start(); } catch (Exception e) { e.printStackTrace(); checkUpdateButton.setText(originalText); checkUpdateButton.setEnabled(true); statusTitleLabel.setText("检查失败"); statusMessageLabel.setText("检查更新失败,请检查网络后重试。"); JOptionPane.showMessageDialog(banbenguanli.this, "检查更新失败: " + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } }; worker.execute(); } private void requestLoginToken() { SwingWorker worker = new SwingWorker() { @Override protected String doInBackground() throws Exception { try { URL url = new URL(LOGIN_URL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setConnectTimeout(10000); connection.setReadTimeout(15000); connection.setDoOutput(true); // 构建登录数据 String loginData = "username=" + URLEncoder.encode(LOGIN_USERNAME, "UTF-8") + "&password=" + URLEncoder.encode(LOGIN_PASSWORD, "UTF-8"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); OutputStream os = connection.getOutputStream(); os.write(loginData.getBytes()); os.flush(); int responseCode = connection.getResponseCode(); if (responseCode == 200) { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); String jsonResponse = response.toString(); int code = extractJsonInt(jsonResponse, "code"); if (code == 0) { String tokenType = extractJsonValue(jsonResponse, "tokentype"); String token = extractJsonValue(jsonResponse, "token"); return tokenType + " " + token; } else { throw new Exception("登录失败,错误代码: " + code); } } else { throw new Exception("HTTP错误代码: " + responseCode); } } catch (Exception e) { e.printStackTrace(); throw e; } } @Override protected void done() { try { loginToken = get(); statusMessageLabel.setText("正在下载最新安装包,请稍候..."); downloadPackage(); } catch (Exception e) { e.printStackTrace(); handleDownloadError("获取授权失败,请稍后重试。"); } } }; worker.execute(); } private void startUpdate() { if (!updateAvailable || downloadUrl.isEmpty()) { JOptionPane.showMessageDialog(this, "无法更新:下载地址无效", "错误", JOptionPane.ERROR_MESSAGE); return; } // 禁用按钮 checkUpdateButton.setEnabled(false); updateButton.setEnabled(false); updateButton.setText("更新中..."); // 显示下载进度 progressPanel.setVisible(true); downloadProgressBar.setValue(0); progressPercentLabel.setText("0%"); statusTitleLabel.setText("更新中"); statusMessageLabel.setText("正在准备下载,请稍候..."); // 请求登录token requestLoginToken(); } private void downloadPackage() { SwingWorker downloadWorker = new SwingWorker() { @Override protected Void doInBackground() throws Exception { //System.out.println("开始下载,URL: " + downloadUrl); //System.out.println("使用的Token: " + loginToken); try { URL url = new URL(downloadUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 添加认证头 if (!loginToken.isEmpty()) { connection.setRequestProperty("Authorization", loginToken); //System.out.println("设置Authorization头: " + loginToken); } connection.setConnectTimeout(10000); connection.setReadTimeout(30000); int fileSize = connection.getContentLength(); // 创建下载目录 File downloadDir = new File("downloads"); if (!downloadDir.exists()) { downloadDir.mkdirs(); } // 创建输出文件 String fileName = "Issue_cards_" + latestVersion + ".apk"; File outputFile = new File(downloadDir, fileName); try (InputStream inputStream = connection.getInputStream(); FileOutputStream outputStream = new FileOutputStream(outputFile)) { byte[] buffer = new byte[4096]; int bytesRead; long totalBytesRead = 0; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); totalBytesRead += bytesRead; // 计算并发布进度 int progress = 0; if (fileSize > 0) { progress = (int) (totalBytesRead * 100 / fileSize); } else { // 如果无法获取文件大小,使用模拟进度 progress += (int) (Math.random() * 8); if (progress >= 100) progress = 100; } publish(progress); // 模拟下载速度 Thread.sleep(50); if (isCancelled()) { break; } } } connection.disconnect(); } catch (Exception e) { e.printStackTrace(); throw e; } return null; } @Override protected void process(java.util.List chunks) { int progress = chunks.get(chunks.size() - 1); downloadProgressBar.setValue(progress); progressPercentLabel.setText(progress + "%"); } @Override protected void done() { try { get(); // 检查是否有异常 // 下载完成 downloadProgressBar.setValue(100); progressPercentLabel.setText("100%"); // 更新完成 SwingUtilities.invokeLater(() -> { finishUpdate(); }); } catch (Exception e) { e.printStackTrace(); handleDownloadError("下载失败,请检查网络后重试。"); } } }; downloadWorker.execute(); } private void finishUpdate() { // 隐藏进度条 progressPanel.setVisible(false); updateButton.setText("更新完成"); updateButton.setBackground(new Color(149, 165, 166)); // 更新版本信息 currentVersion = latestVersion; currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); updateAvailable = false; updateVersionInfo(); // 显示成功消息 statusTitleLabel.setText("更新完成"); statusMessageLabel.setText("系统已成功更新到最新版本,所有功能已优化。"); // 重置状态 checkUpdateButton.setEnabled(true); updateButton.setEnabled(false); // 清理临时数据 downloadUrl = ""; releaseNotes = ""; loginToken = ""; JOptionPane.showMessageDialog(banbenguanli.this, "更新完成!安装包已下载到 downloads 文件夹。", "更新成功", JOptionPane.INFORMATION_MESSAGE); } private void handleDownloadError(String message) { progressPanel.setVisible(false); updateButton.setText("立即更新"); updateButton.setEnabled(updateAvailable); checkUpdateButton.setEnabled(true); statusTitleLabel.setText("更新失败"); statusMessageLabel.setText(message); JOptionPane.showMessageDialog(this, message, "错误", JOptionPane.ERROR_MESSAGE); } // 进度面板引用 private JPanel progressPanel; // 静态方法:显示版本管理对话框 public static void showVersionManagementDialog(JFrame parent) { SwingUtilities.invokeLater(() -> { banbenguanli dialog = new banbenguanli(parent); dialog.setVisible(true); }); } }