gpt4 book ai didi

JavaFX : How can I use correctly a ProgressIndicator in JavaFX

转载 作者:搜寻专家 更新时间:2023-10-31 08:09:55 25 4
gpt4 key购买 nike

我是 JavaFX 的新手。我的 JavaFX 应用程序有问题,我需要在数据库查询之前启动 ProgressIndicator(键入 INDETERMINATE)。这是我的代码的一部分:

spinner.setVisible(true);
passCripto = cripto.criptoPass(pass);
MyDao dao = new MyDaoImpl();
boolean isLoginOk = dao.isUserOk(user, passCripto);
boolean isStatusOk = dao.idStatusUser(user);

完成后,我需要将微调器设置为 FALSE,但微调器仅在数据库查询完成时显示。我该如何解决这个问题?

谢谢。

我这样做了,但没有解决:

Task<Boolean> taskValidaLogin = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
boolean validaLogin = ACDCDao.validaUsuario(usuario, senhaCripto);

return validaLogin;
}
};

Task<Boolean> taskValidaStatus = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
boolean validaStatus = ACDCDao.validaStatusUsuario(usuario);

return validaStatus;
}
};

new Thread(taskValidaLogin).start();
new Thread(taskValidaStatus).start();
if (taskValidaLogin.getValue()) {
if (taskValidaStatus.getValue()) {
//do something
}

最佳答案

你必须在另一个线程中处理你的数据库,因为如果操作需要时间,它会卡住 JavaFX 线程(GUI)

在 JavaFx 中,您可以使用 Service 和 Task 来做后台工作。你应该阅读

通过将您的数据库内容执行到服务中,您将能够轻松地监控它,因为服务提供了执行此操作所必需的,并具有类似 onSuccedeed、onFailed 的方法...

如果你想正确地执行 JavaFx,那么真正地看看它是必不可少的部分。

主程序.java

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

服务示例.java

import javafx.concurrent.Service;
import javafx.concurrent.Task;

public class ServiceExample extends Service<String> {
@Override
protected Task<String> createTask() {
return new Task<String>() {
@Override
protected String call() throws Exception {
//DO YOU HARD STUFF HERE
String res = "toto";
Thread.sleep(5000);
return res;
}
};
}
}

Controller .java

import javafx.concurrent.WorkerStateEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.ProgressIndicator;

public class Controller {

@FXML
private ProgressIndicator progressIndicator;

public void initialize() {
final ServiceExample serviceExample = new ServiceExample();

//Here you tell your progress indicator is visible only when the service is runing
progressIndicator.visibleProperty().bind(serviceExample.runningProperty());
serviceExample.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent workerStateEvent) {
String result = serviceExample.getValue(); //here you get the return value of your service
}
});

serviceExample.setOnFailed(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent workerStateEvent) {
//DO stuff on failed
}
});
serviceExample.restart(); //here you start your service
}
}

示例.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="200.0" prefWidth="200.0" xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/2.2" fx:controller="Controller">
<ProgressIndicator fx:id="progressIndicator" layoutX="78.0" layoutY="55.0"/>
</AnchorPane>

我快速完成了这个示例,它很基础,但我认为这就是您想要的。 (我没有将我的 progressIndicator 添加到节点,这只是为了示例)

关于JavaFX : How can I use correctly a ProgressIndicator in JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22098288/

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