JAVA-如何确保在执行器开始阻止UI线程之前隐藏节点

JAVA-如何确保在执行器开始阻止UI线程之前隐藏节点,java,multithreading,javafx,concurrency,Java,Multithreading,Javafx,Concurrency,当用户单击UI上的某个按钮时,我希望该按钮被隐藏,然后我希望启动一个后台任务来执行一系列操作 编辑:如何确保在任何其他阻止任务开始之前隐藏按钮? class startTask implements Callable<Void>{ @Override public Void call() { //.....Do a bunch of stuff..... return null; } } public void hitThe

当用户单击UI上的某个按钮时,我希望该按钮被隐藏,然后我希望启动一个后台任务来执行一系列操作

编辑:如何确保在任何其他阻止任务开始之前隐藏按钮?

class startTask implements Callable<Void>{
    @Override
    public Void call() {
        //.....Do a bunch of stuff.....
        return null;
    }
}

 public void hitTheButton() throws ExecutionException, InterruptedException {
    hideTheButton();
    //this only happens first IF i remove the .get()

    StartTask startTask = new StartTask();
    ExecutorService ex = Executors.newSingleThreadExecutor();
    Future<?> exFuture = ex.submit(startSyncTask);
    exFuture.get();
    //.... Now we can continue with the program....        
}

public void hideThebutton(){
    FadeTransition ft = new FadeTransition(Duration.millis(10), myButton);
    ft.setFromValue(1);
    ft.setToValue(0);
    ft.setCycleCount(1);
    ft.setAutoReverse(false);
}
类startTask实现可调用{
@凌驾
公开作废通知(){
//…做一大堆事情。。。。。
返回null;
}
}
public void hitTheButton()引发ExecutionException、InterruptedException{
隐藏按钮();
//只有在删除.get()时,才会首先发生这种情况
StartTask StartTask=新的StartTask();
ExecutorService ex=Executors.newSingleThreadExecutor();
Future-exFuture=ex.submit(startSyncTask);
exFuture.get();
//……现在我们可以继续这个节目了。。。。
}
公共无效隐藏按钮(){
FadeTransition ft=新的FadeTransition(持续时间.毫秒(10),myButton);
ft.setFromValue(1);
ft.setToValue(0);
ft.setCycleCount(1);
ft.setAutoReverse(假);
}
我还尝试将
.isDone()
放入while循环中,但没有成功

我知道UI被.get()阻塞了,但是为什么在我实例化执行器之前隐藏方法就不能完成呢???

您写道:

我知道UI被.get()阻塞了,但是为什么 隐藏方法在我实例化执行器之前完成

JavaFXUI在调用代码的“中间”更新。实际上,您要做的是让JavaFX运行时执行一些更改,比如隐藏、启用转换的一部分。运行时将在该点标记它必须对该节点执行某些操作,但将等待执行下一个UI勾选

使用您的
exFuture.get()阻止执行下一个UI勾选,因此不会更新用户界面。
如果使用,则可以创建并使用其各种状态时刻来操纵按钮节点

Button button;
Task<?> task;
task.setOnSucceeded(e -> showButton(button));
task.setOnFailed(e -> showButton(button));
hideButton(button);
executor.submit(task);
按钮;
任务;
task.setonSucceed(e->showButton(按钮));
task.setOnFailed(e->showButton(按钮));
隐藏按钮(按钮);
执行人提交(任务);
您写道:

我知道UI被.get()阻塞了,但是为什么 隐藏方法在我实例化执行器之前完成

JavaFXUI在调用代码的“中间”更新。实际上,您要做的是让JavaFX运行时执行一些更改,比如隐藏、启用转换的一部分。运行时将在该点标记它必须对该节点执行某些操作,但将等待执行下一个UI勾选

使用您的
exFuture.get()阻止执行下一个UI勾选,因此不会更新用户界面。
如果使用,则可以创建并使用其各种状态时刻来操纵按钮节点

Button button;
Task<?> task;
task.setOnSucceeded(e -> showButton(button));
task.setOnFailed(e -> showButton(button));
hideButton(button);
executor.submit(task);
按钮;
任务;
task.setonSucceed(e->showButton(按钮));
task.setOnFailed(e->showButton(按钮));
隐藏按钮(按钮);
执行人提交(任务);


如果使用
get
立即阻止其结果,那么在单独的线程中运行
StartTask
有什么意义?您也可以在同一个线程中运行该任务。因为我正试图找出如何隐藏按钮。所以只需删除
exFuture.get()
。因此,如果我在该位置取消阻止,程序将继续运行,而不必等待网络调用和数据库项的设置。程序必须停在这里获取数据。无论我如何尝试,此时的任何阻塞也会阻塞hideTheButton方法,即使我先调用它。我很困惑。我想还有一点,也许这有帮助:“无论我如何尝试,在这一点上的任何阻塞也会阻塞
hideTheButton
方法,即使我先调用它。”这是不正确的。无论是否调用
exFuture.get()
,您的
hideTheButton()
方法都会在启动任务之前完成。但是,
hideTheButton()
中的任何内容都不会强制立即呈现UI(而且,在您询问之前,没有API强制按照设计呈现UI)。您所要做的就是更改按钮的某些属性,这将在下次呈现UI时产生视觉效果。如果使用
get
立即阻止其结果,则在单独的线程中运行
StartTask
有什么意义?您也可以在同一个线程中运行该任务。因为我正试图找出如何隐藏按钮。所以只需删除
exFuture.get()
。因此,如果我在该位置取消阻止,程序将继续运行,而不必等待网络调用和数据库项的设置。程序必须停在这里获取数据。无论我如何尝试,此时的任何阻塞也会阻塞hideTheButton方法,即使我先调用它。我很困惑。我想还有一点,也许这有帮助:“无论我如何尝试,在这一点上的任何阻塞也会阻塞
hideTheButton
方法,即使我先调用它。”这是不正确的。无论是否调用
exFuture.get()
,您的
hideTheButton()
方法都会在启动任务之前完成。但是,
hideTheButton()
中的任何内容都不会强制立即呈现UI(而且,在您询问之前,没有API强制按照设计呈现UI)。您所要做的就是更改按钮的某些属性,这将在下次呈现UI时产生视觉效果。那么,如何隐藏按钮,然后执行后台线程,等待按钮完成,然后继续执行程序?@DanielH。你没有。你隐藏按钮;你开始这项任务;任务完成后,您可以将其取消隐藏。您可能还想禁用其他一些UI元素。谢谢您的帮助。我很难相信,在阻止任务接管并阻止用户界面更新之前,我不能隐藏节点。@DanielH。你的
按下按钮