2016-04-23 14 views
1

我有一个Dialog类与它一wait方法来显示我的自定义进度对话框延迟显示在JavaFX的节点运行Android

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

我有这一段代码在我的类中的一个到dislay我陆侃对话框

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

但遗憾的是其显示一个延迟,我也试图把它包装在一个线程但它没有工作,我试图运行它在桌面和它的工作完美,但为什么不在我的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); 
        } 
     }); 
    } 
}); 

上述情况发生时,你单击按钮,输出应该是:对话会马上为你按一下按钮尽快弹出,但可悲的比方说,按钮完成整个过程后,对话框会显示!我试图把它包裹在线程但没有运气!

请帮帮我!任何想法?

+0

你的'Dialog'类从哪里扩展?从内置的JavaFX对话框?从胶子的对话?或者它是一个免费的实现? –

+0

这是我自己定制的对话框,先生。 –

+0

不错,你有它的工作,但有时不需要重新发明轮子:)内置的'对话框(JavaFX或胶子的)都可以轻松定制。 –

回答

0

我通过在鼠标事件的一个分离的执行,而不是把所有一起在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(); 
    } 
}); 

此代码工作!

1

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

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

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

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

Progress Dialog

尝试用你的替代伪任务,看看它是如何去。