首页 > 编程语言 >JavaFX:FX.应用更新检测功能(在线自动更新方案)

JavaFX:FX.应用更新检测功能(在线自动更新方案)

时间:2023-01-08 16:12:49浏览次数:38  
标签:版本 FX JavaFX binding 自动更新 new root stage

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。

1. 整体方案

JavaFX.应用版本检测、自动更新主要涉及一下步骤:

  1. 读取本地应用版本
  2. 拉取远程版本并比较两个版本
  3. 如果需要升级,那么拉取更新历史
  4. 弹出升级控制窗口
  5. 用户选择升级时,拉取升级包解压,重启应用
  6. 用户选择忽略时,本地版本标志为忽略版本
  7. 用户选择取消时,隐藏升级控制窗口

2. 版本检测

版本检测功能最好采用JavaFX的Task异步进行,下面是一个实现方案:

class UpgradeTask extends Task<Void> {

    private final UpgradeBinding binding;
    private final Properties config;
    private final String currentVersion;

    public UpgradeTask(UpgradeBinding binding, String currentVersion) {
        this.binding = binding;
        this.currentVersion = currentVersion;
        config = new Properties();
        try (InputStream is = this.getClass().getResourceAsStream("/upgrade.properties")) {
            config.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    protected Void call() {
        String versionAPI = config.getProperty("version.api");
        String remoteVersion = HTTP.get(versionAPI);
        if (!Objects.equals(currentVersion, remoteVersion)) {
            Platform.runLater(() -> {
                binding.upgrade.set(true);
                binding.version.set(remoteVersion);
            });

            String changelogAPI = config.getProperty("changelog.api");
            String changelog = HTTP.get(changelogAPI);

            Platform.runLater(() -> binding.changelog.set(changelog));
        }
        return null;
    }
}

升级服务器信息配置在upgrade.properties配置文件中,在主应用打包的时候一起打包。

3. UI.设计

这里只是简单的开发了一个控制窗口,具体可以根据需要进一步完善:

class UpgradeUI {

    private final UpgradeBinding binding;
    private final Stage stage;

    public UpgradeUI(UpgradeBinding binding, Stage owner) {
        this.stage = new Stage();
        this.stage.initOwner(owner);
        this.binding = binding;
    }

    public void show() {
        Label version = new Label();
        version.textProperty().bind(binding.version);

        TextArea textArea = new TextArea();
        textArea.textProperty().bind(binding.changelog);
        textArea.setDisable(false);

        Button cancel = new Button("取消");
        cancel.setOnMouseClicked(event -> stage.close());

        VBox root = new VBox();
        root.setPadding(new Insets(20));
        root.setSpacing(20);

        HBox vContainer = new HBox();
        vContainer.setSpacing(10);
        vContainer.setAlignment(Pos.CENTER_LEFT);
        vContainer.getChildren().addAll(new Label("最新版本:"), version);

        VBox cContainer = new VBox();
        cContainer.setSpacing(10);
        cContainer.getChildren().addAll(new Label("更新内容:"), textArea);

        HBox bContainer = new HBox();
        bContainer.setSpacing(20);
        bContainer.setAlignment(Pos.CENTER);
        bContainer.getChildren().addAll(new Button("更新"), new Button("跳过"), cancel);

        root.getChildren().addAll(vContainer, cContainer, bContainer);

        stage.setScene(new Scene((root)));
        stage.setWidth(320);
        stage.setHeight(240);
        stage.setResizable(false);
        stage.getIcons().clear();
        stage.getIcons().add(new Image("logo.jpg"));
        stage.show();
    }
}

注意上面仅实现了取消功能,如果需要实现更新和跳过功能需要进一步完善,即整体方案中提到的第5点和第6点。

4. 流程控制

在主进程中异步启动升级检测线程:

public class Sample03 extends Application {

    @Override
    public void start(Stage stage) {
        StackPane root = new StackPane();
        root.getChildren().add(new Label("版本:0.1"));

        stage.setScene(new Scene(root));
        stage.setWidth(640);
        stage.setHeight(480);
        stage.setTitle("版本检测 + 自动更新");
        stage.getIcons().clear();
        stage.getIcons().add(new Image("logo.jpg"));
        stage.show();

        UpgradeBinding binding = new UpgradeBinding();
        UpgradeUI ui = new UpgradeUI(binding, stage);
        UpgradeTask task = new UpgradeTask(binding, "0.1");
        task.setOnSucceeded(e -> {
            if (binding.upgrade.get()) {
                ui.show();
            }
        });
        Thread t = new Thread(task);
        t.setDaemon(true);
        t.start();
    }
}

最终效果:

标签:版本,FX,JavaFX,binding,自动更新,new,root,stage
From: https://www.cnblogs.com/michong2022/p/17034796.html

相关文章

  • JavaFX:实现撤销(undo)、重做(redo)功能
    撤销和重做功能在很多软件都是非常普遍的,这里记录一下JavaFX实现撤销和重做功能的一种方案:1.接口定义对于所有能执行撤销和重做的动作定义统一的接口:publicinterface......
  • JavaFX:实现滚动 + 缩放联动
    JavaFX要实现滚动可以使用ScrollPane,要实现缩放可以通过调用setScaleX和setScaleY、setScaleZ,如果需要实现滚动+缩放联动,那么需要一点点小技巧,这里记录一下。1.实现滚......
  • JavaFX:构建JavaFX的IoC,实现Bean管理,自由注入Contoller需要的Bean
    习惯了使用Spring的IoC开发JavaEE应用之后,总想着在JavaFX开发中使用IoC管理应用中的单例对象,这里记录一下构建JavaFX.IoC实现Bean管理和依赖注入的过程。1.IoC.需求实际......
  • javaFX中Label如何设置居中
    Labellabel=newLabel("居中");HBoxhBox=newHBox();hBox.getChildren().addAll(label);hBox.setPrefHeight(35);hBox.setPrefWidth(410);hBox.setLayoutX(125);//hBo......
  • javaFX中Label如何设置居中
    Labellabel=newLabel("居中");HBoxhBox=newHBox();hBox.getChildren().addAll(label);hBox.setPrefHeight(35);hBox.setPrefWidth(410);hBox.setLayoutX(125);//hBo......
  • javaFX中Label如何设置居中
    Labellabel=newLabel("居中");HBoxhBox=newHBox();hBox.getChildren().addAll(label);hBox.setPrefHeight(35);hBox.setPrefWidth(410);hBox.setLayoutX(125);//hBo......
  • windows,linux下SVN实现自动更新WEB目录
    通过SVN进行版本库管理,每次提交后,都要在SVN服务器更新最新上传的版本到WEB目录进行同步。操作比较烦琐,而且效率也低。使用SVN钩子脚本进行WEB目录同步,可很好的解决这方面的......
  • WIN10系统禁止自动更新设置
    win10系统总是自动更新,很多情况下会导致系统不稳定。对于开发者而言一次更新完全有可能让你的计算机里的某个环境不能正常运行。前不久因为系统自动更新导致我的HTCvive的......
  • 【ADSP-BF561 EZ-KIT Lite】PROGRAMMABLE FLAGS(PFx)
    TheADSP-BF561has48bi-directional,general-purposeI/O,ProgrammableFlag(PF47-0)pins.TheProgrammableFlagpinshavespecialfunctionsforSPIportopera......
  • 安卓-PorterDuffXfermode
    一、当我们要实现两张图片之间的混合模式的时候经常会用到PorterDuffXfermode二、使用方法mPaint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.DST_IN));在mPa......