gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:25:59 25 4
gpt4 key购买 nike

我有一个 Dialog 类,其中包含 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)中有这段代码来显示我的进度对话框:

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

当您单击按钮时,就会发生上述情况,输出应该是:单击按钮后立即弹出对话框,但遗憾的是,按钮的整个过程完成后将显示对话框!我尝试将其包裹在 Thread 中,但没有成功!

请帮助我!任何想法?

最佳答案

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

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

使用适用于您的 IDE 的 Gluon 插件,创建一个单 View 移动项目,并使用此项目修改 View :

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

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

关于java - 在运行 Android 的 JavaFx 中显示节点的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36809482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com