在 JavaFx 中延迟显示节点 运行 Android

Delay in displaying the node in JavaFx running Android

我有一个 Dialog class,里面有一个 wait 方法来显示我的自定义 进度对话框 :

public static void wait(String title){
    isOpen = true;
    ProgressIndicator progress = new ProgressIndicator(-1);

    Label label = new Label(title);
    label.getStyleClass().add("login-label");

    HBox container = new HBox();
    container.setStyle("-fx-background-color: white;");
    container.setAlignment(Pos.CENTER);
    container.getChildren().addAll(progress,label);
    if(Main.HEIGHT < 700){
        container.setSpacing(10);
        container.setPadding(new Insets(10,15,10,15));
    }else if(Main.HEIGHT < 1200){
        container.setSpacing(15);
        container.setPadding(new Insets(15,20,15,20));
    }else{
        container.setSpacing(20);
        container.setPadding(new Insets(20,30,20,30));
    }

    show("", container);
}

我的 class 中有一段代码可以显示我的 Progess Dialog:

Platform.runLater(new Runnable(){
    @Override
    public void run() {
        Dialog.wait("Processing, please wait...");
    }
});

但不幸的是它的显示有延迟,我也尝试将它包装在一个线程中,但它没有用同样,我尝试在 Desktop 中 运行 它并且它运行良好,但为什么不在我的 Android 设备 中呢?

完整代码如下:

download = new Button("Download");
download.getStyleClass().add("terminal-button");
download.setPrefWidth(Main.HEIGHT > 700 ? 180 : 140);
download.setOnAction(new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent event) {

        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                Dialog.wait("Processing, please wait...");
            }
        });

        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                //GET THE SELECTED AREAS FOR DOWNLOAD
                List<String> selectedSectors = new ArrayList();
                String sectorid = null;
                for(Sector r : listView.getItems()){
                    if(r.isSelected()){
                        selectedSectors.add(r.getObjid());
                        sectorid = r.getObjid();
                    }
                }

                if(selectedSectors.size() > 1){
                    Dialog.hide();
                    Dialog.showAlert("Multiple downloads are not supported!");
                    return;
                }

                MobileDownloadService mobileSvc = new MobileDownloadService(); 
                //INIT DOWNLOAD
                Map params = new HashMap();
                params.put("assigneeid", SystemPlatformFactory.getPlatform().getSystem().getUserID());
                params.put("sectorid", sectorid);
                batchid = mobileSvc.initForDownload(params);

                int recordcount = -1;
                while (true) {
                    int stat = mobileSvc.getBatchStatus(batchid); 
                    if ( stat < 0 ) {
                        try {  
                            Thread.sleep(2000); 
                        }catch(Throwable t){;} 
                    } else {
                        recordcount = stat; 
                        break; 
                    }
                }

                if ( recordcount <= 0 ) {
                    Dialog.hide();
                    Dialog.showError("No data to download");
                    return;
                }

                downloadsize = recordcount;
                accountList = new ArrayList();
                int start=0, limit=50;
                while ( start < recordcount ) {
                    params = new HashMap();
                    params.put("batchid", batchid);
                    params.put("_start", start);
                    params.put("_limit", limit); 
                    List<Map> list = mobileSvc.download(params);
                    //if ( list != null ) accountList.addAll( list ); 
                    System.out.println("fetch results is " + list.size());
                    //new Thread( new ProcessDownloadResultTask(start,list)).start(); 
                    start += limit;                             
                }

                Dialog.hide();

                //SAVE AREA, STUBOUTS
                clearSector();
                for(Sector r : listView.getItems()){
                    if(r.isSelected()){
                        saveSector(r);
                    }
                }

                label.setVisible(true);
                progressbar.setVisible(true);
                progressbar.progressProperty().bind(task.progressProperty());
                new Thread(task).start();
                download.setText("Cancel");
                download.setDisable(false);
                download.setOnAction(new EventHandler<ActionEvent>(){
                    @Override
                    public void handle(ActionEvent event) {
                        continueDownload = false;
                        label.setVisible(false);
                        progressbar.setVisible(false);
                        download.setText("Back");
                        download.setOnAction(new EventHandler<ActionEvent>(){
                            @Override
                            public void handle(ActionEvent event) {
                                Main.ROOT.setCenter(new Home().getLayout());
                            }
                        });
                        root.setOnKeyReleased(new EventHandler<KeyEvent>(){
                            @Override
                            public void handle(KeyEvent event) {
                                if(event.getCode() == KeyCode.ESCAPE){
                                    if(Dialog.isOpen){ Dialog.hide(); return; }
                                    Main.ROOT.setCenter(new Home().getLayout());
                                }
                            }
                        });
                        Map params = new HashMap();
                        params.put("batchid", batchid);
                        params.put("downloadedlist", downloadedList);
                        MobileDownloadService svc = new MobileDownloadService();
                        svc.cancelDownload(params);
                    }
                });
                download.setDisable(false);
                    }
        });
    }
});

当您单击按钮时会出现上述情况,输出应为:单击按钮后立即弹出对话框,可惜的是,Dialog是在按钮的整个过程完成后才会显示的!我试图将它包装在 Thread 中,但没有成功!

请帮帮我!任何的想法?

这是一个简短的示例,展示了如何使用 Gluon 的 Dialog 来处理后台任务的进度通知。

它使用虚拟任务,但您可以看到如何处理显示和隐藏对话框,以及使用 ProgressBar 通知进度,甚至取消任务。

为您的 IDE 使用 Gluon 插件,创建一个单一视图移动项目,并用这个修改视图:

public class BasicView extends View {

    public BasicView(String name) {
        super(name);

        Dialog dialog = new Dialog("Download Progress");

        final ProgressBar progressBar = new ProgressBar();
        progressBar.setPrefWidth(200);

        final Label label = new Label("Process has ended");

        VBox vbox = new VBox(10, new Label("Download in progress..."), progressBar, label);
        vbox.setAlignment(Pos.CENTER);
        dialog.setContent(vbox);

        final Button cancel = new Button("Cancel");
        dialog.getButtons().add(cancel);

        dialog.setOnShown(e -> {
            cancel.setDisable(false);
            label.setVisible(false);

            final Task<Void> task = createDownloadTask();
            progressBar.progressProperty().bind(task.progressProperty());

            cancel.setOnAction(a -> task.cancel(true));

            task.setOnCancelled(c -> {
                PauseTransition pause = new PauseTransition(Duration.seconds(1));
                pause.setOnFinished(t -> dialog.hide());
                cancel.setDisable(true);
                label.setVisible(true);
                pause.play();
            });

            task.setOnSucceeded(s -> {
                PauseTransition pause = new PauseTransition(Duration.seconds(1));
                pause.setOnFinished(t -> dialog.hide());
                cancel.setDisable(true);
                label.setVisible(true);
                pause.play();
            });

            final Thread thread = new Thread(task);
            thread.setDaemon(true);
            thread.start();
        });

        Button button = new Button("Download");
        button.setGraphic(new Icon(MaterialDesignIcon.CLOUD_DOWNLOAD));
        button.setOnAction(e -> dialog.showAndWait());

        setCenter(new StackPane(button));
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> System.out.println("Menu")));
        appBar.setTitleText("Downloads View");
    }

    private Task<Void> createDownloadTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                for(int i = 0; i <= 10; i++) {
                    if (isCancelled()) {
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                        updateProgress(i, 10);
                    } catch (InterruptedException ie) { 
                        if (isCancelled()) {
                            break;
                        }
                    }
                }
                return null;
            }
        };
    }
}

尝试用您的任务替换虚拟任务,看看效果如何。

我通过在一个鼠标事件中分离它的执行解决了这个问题,而不是把所有的都放在 setOnAction 中,我把代码 Dialog.wait("Processing, please wait..."); 放在 setOnMousePressed 中,像这样:

download.setOnMousePressed(new EventHandler<MouseEvent>(){
    @Override
    public void handle(MouseEvent event) {
        if(!Dialog.isOpen) Dialog.wait("Processing, please wait...");
    }
});
download.setOnMouseReleased(new EventHandler<MouseEvent>(){
    @Override
    public void handle(MouseEvent event) {
        doDownload();
    }
});

此代码有效!