Java 任务成功后,进度指示器将继续运行。。。我怎样才能阻止它?
单击按钮时,我启动一个任务以验证用户,然后如果用户已验证,则它将运行另一个任务以获取用户当前打开的班次 我为这项任务绑定了一个进度指示器。。。但问题是,在任务成功后,指示器不会停止 更新1 我试图做的是仅当用户经过身份验证时才运行getUserShift任务(authenticate返回的用户不为null) 那么这里的问题是什么:Java 任务成功后,进度指示器将继续运行。。。我怎样才能阻止它?,java,javafx,Java,Javafx,单击按钮时,我启动一个任务以验证用户,然后如果用户已验证,则它将运行另一个任务以获取用户当前打开的班次 我为这项任务绑定了一个进度指示器。。。但问题是,在任务成功后,指示器不会停止 更新1 我试图做的是仅当用户经过身份验证时才运行getUserShift任务(authenticate返回的用户不为null) 那么这里的问题是什么: @FXML private void signInAction(ActionEvent event) { String username = userName
@FXML
private void signInAction(ActionEvent event) {
String username = userNameText.getText();
String password = passwordText.getText();
Task<Void> runSignInTask = signInTask();
runSignInTask.setOnSucceeded(e -> {
System.out.println("SignIn Task Succeeded");
progressIndicator.progressProperty().unbind();
});
runSignInTask.setOnFailed(e -> {
System.out.println("SignIn Task Failed??!!");
});
progressIndicator.progressProperty().bind(runSignInTask.progressProperty());
new Thread(runSignInTask).start();
}
public Task<Void> signInTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
Task<User> runAuthTask = authenticate();
runAuthTask.setOnSucceeded(e -> {
System.out.println("Task Succeded!!");
//Check if user Authenticated
if (runAuthTask.getValue() != null) {
System.out.println("Access permitted");
//Run the second Task
Task<Shift> runGetUserShift = getUserShift(runAuthTask.getValue());
runGetUserShift.setOnSucceeded(l -> {
System.out.println("getUserShift task succeeded");
if (runGetUserShift.getValue() != null) {
Shift shift = runGetUserShift.getValue();
System.out.println("User has open shift");
}
});
runGetUserShift.setOnFailed(l -> {
System.out.println("getUserShift task Failed");
});
new Thread(runGetUserShift).start();
} else {
System.out.println("Access Denied!!");
}
});
runAuthTask.setOnFailed(e -> {
System.out.println("Task Failed!!");
});
new Thread(runAuthTask).start();
return null;
}
};
}
public Task<User> authenticate() {
return new Task<User>() {
@Override
protected User call() throws Exception {
return Authenticator.authenticated(userNameText.getText(), passwordText.getText());
}
};
}
public Task<Shift> getUserShift(User user) {
return new Task<Shift>() {
@Override
protected Shift call() throws Exception {
return ShiftDAO.getShift(user.getUserId(), user.getBranchId(), user.getComId());
}
};
}
@FXML
私人无效签名(ActionEvent事件){
字符串username=userNameText.getText();
字符串密码=passwordText.getText();
任务runSignInTask=signInTask();
runSignInTask.setonsucceed(e->{
System.out.println(“登录任务成功”);
progressIndicator.progressProperty().unbind();
});
runSignInTask.setOnFailed(e->{
System.out.println(“登录任务失败???”;
});
progressIndicator.progressProperty().bind(runSignInTask.progressProperty());
新线程(runSignInTask).start();
}
公共任务符号任务(){
返回新任务(){
@凌驾
受保护的Void调用()引发异常{
任务runAuthTask=authenticate();
runAuthTask.setOnSucceeded(e->{
System.out.println(“任务成功!!”;
//检查用户是否已通过身份验证
if(runAuthTask.getValue()!=null){
System.out.println(“允许访问”);
//运行第二个任务
Task runGetUserShift=getUserShift(runAuthTask.getValue());
runGetUserShift.setOnSucceeded(l->{
System.out.println(“getUserShift任务成功”);
if(runGetUserShift.getValue()!=null){
Shift=runGetUserShift.getValue();
System.out.println(“用户有打开的班次”);
}
});
runGetUserShift.setOnFailed(l->{
System.out.println(“getUserShift任务失败”);
});
新线程(runGetUserShift.start();
}否则{
System.out.println(“拒绝访问!!”;
}
});
runAuthTask.setOnFailed(e->{
System.out.println(“任务失败!!”;
});
新线程(runAuthTask).start();
返回null;
}
};
}
公共任务身份验证(){
返回新任务(){
@凌驾
受保护的用户调用()引发异常{
返回Authenticator.authenticated(userNameText.getText(),passwordText.getText());
}
};
}
公共任务getUserShift(用户){
返回新任务(){
@凌驾
受保护的移位调用()引发异常{
返回ShiftDAO.getShift(user.getUserId(),user.getBranchId(),user.getComId());
}
};
}
登录过程完成后progressIndicator没有停止,这是一个应用程序设计错误
我建议您使用单个任务完成所有工作,以便用户登录。
您的登录任务可能如下所示:
public Task<Void> signInTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
User user = Authenticator.authenticated(userNameText.getText(), passwordText.getText());
if(user != null){
Shift shift = ShiftDAO.getShift(user.getUserId(), user.getBranchId(), user.getComId());
if(shift != null){
// logic if user has a shift
} else {
// logic if user has no shift, throw exception, etc.
}
} else {
// logic if user is not authenticated, throw exception, etc.
}
return null;
}
}
}
公共任务符号任务(){
返回新任务(){
@凌驾
受保护的Void调用()引发异常{
User User=Authenticator.authenticated(userNameText.getText(),passwordText.getText());
如果(用户!=null){
Shift-Shift=ShiftDAO.getShift(user.getUserId(),user.getBranchId(),user.getComId());
如果(移位!=null){
//如果用户有班次,则为逻辑
}否则{
//用户无移位、抛出异常等情况下的逻辑。
}
}否则{
//如果用户未通过身份验证,则抛出异常等。
}
返回null;
}
}
}
有关更多信息,请参阅和。为什么在另一个JavaFX任务中运行带有JavaFX任务的线程?无论如何,您的
登录任务将立即进入成功
状态;它所做的就是在后台启动一个新线程。@fireandfuel我想如果我这样做,它们将在相同的环境中运行task@James_D好的,我更新了这个问题,希望它能澄清我想要实现的目标。。。那么,实现这一点的正确方法是什么?@Gado如果您希望在runSignInTask
成功后立即停止“不确定进度”动画,只需将progressIndicator.setProgress(1)
放在progressIndicator.progressProperty().unbind()之后即可。但我的观点是,runSignInTask
根本不做任何需要花费任何明显时间的事情,因此它会立即进入那种状态。现在还不清楚为什么要将这个逻辑分割成独立的任务
在call()
方法的末尾,以便它执行OP希望它执行的操作。您需要返回null当然是code>。@James\u D是的,我完全忘记了返回null代码><代码>更新进程(100100)代码>是可选的。如果您不设置任务中的进度,它将保持在“不确定”,因此动画将在任务完成后继续(或者您可以取消绑定并设置进度指示器的进度;但您需要其中一个)。@James\u D return null不修复它。。。解除绑定不起作用,但设置进度并将其隐藏在onSuccess中起作用。。。只有用火焰和燃料回答。。。我的代码会立即隐藏它。。。实际上,隐藏对于不确定的进度条来说很方便。。。现在对我来说一切都有意义了。。。谢谢你们。