gpt4 book ai didi

JavaFX : why wait cursor needs a new thread?

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

我会明白为什么

 scene.setCursor(Cursor.WAIT);
long task...
scene.setCursor(Cursor.DEFAULT);

需要新线程;它适用于:

private void set_cursore_attesa(final Scene scene)
{
Runnable r=new Runnable() {

@Override
public void run() {
scene.setCursor(Cursor.WAIT);
}
};
Thread t=new Thread(r);
t.start();
}
private void set_cursore_normale(final Scene scene)
{
Runnable r=new Runnable() {

@Override
public void run() {
scene.setCursor(Cursor.DEFAULT);
}
};
Thread t=new Thread(r);
t.start();
}

in my function:
set_cursore_attesa(scene);
long task...
set_cursore_normale(scene);

为什么我不能使用同一个线程? 我:

  1. 将我的光标设置为 WAIT(它进入 GUI 队列)
  2. 做我的长任务...(它进入 GUI 队列,但我预计光标会改变,它在队列中,它在此之前执行)
  3. 将我的光标重置为默认值(在我的任务完成后)

所以,我的长任务没有进入 MAIN 队列?因为,如果它进入主队列,我希望它在我的 WAIT 游标首先插入队列之后执行。为什么会出现这种行为?

最佳答案

如果没有线程,您的代码将在 FX 应用程序线程上执行。这是(有效地)负责将 UI 呈现到屏幕和处理用户输入的线程。如果您在此线程上执行长时间运行的任务,那么在您的长时间运行的任务完成之前,您将阻止 FX 应用程序线程的任何正常功能发生。特别是,如果你这样做

scene.setCursor(Cursor.WAIT);
longRunningTask();
scene.setCursor(Cursor.DEFAULT);

然后设置将按照您指定的顺序进行,但是在所有代码行完成之前场景不会重新渲染。因此,在您的代码完成之前,您永远不会真正看到对 UI 的任何更改(包括对光标的更改)。下次 FX 应用程序线程有机会渲染场景时,光标将设置为 Cursor.DEFAULT,您永远不会看到等待光标。

多线程和 JavaFX 有两条基本规则(同样的规则通常适用于大多数 UI 工具包):

  1. 对 UI 的任何更改必须在 FX 应用程序线程上执行
  2. 长时间运行的进程不应在 FX 应用程序线程上执行(因为它们会使 UI 无响应)

所以您的解决方案实际上并不正确,因为您违反了这两条规则。你应该

  1. 在 FX 应用程序线程上将光标设置为 WAIT
  2. 在后台线程上启动长时间运行的任务
  3. 任务完成后,在 FX 应用程序线程上将光标设置回 DEFAULT

您可以使用 Task 来做到这一点:

scene.setCursor(Cursor.WAIT);
Task<Void> task = new Task<Void>() {
@Override
public Void call() {
// long running task here...
return null ;
}
};
task.setOnSucceeded(e -> scene.setCursor(Cursor.DEFAULT));
new Thread(task).start();

关于JavaFX : why wait cursor needs a new thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33711925/

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