使用JavaFX和Threads时遇到问题。基本上我有两个选择:使用Tasks
或Platform.runLater
。据我所知,Platform.runLater
应该用于简单/简短的任务,Task
用于较长的任务。但是,我不能使用它们中的任何一个。
当我调用Thread
时,它必须在任务中间弹出验证码对话框。在使用Task
时,它忽略了我显示新对话框的请求......它不允许我创建一个新阶段。
另一方面,当我使用Platform.runLater
时,它会让我显示一个对话框,但是,程序的主窗口会冻结,直到显示弹出对话框。
我需要任何解决方案。如果有人知道如何处理这个或有类似的经验并找到了解决方案,我期待着您的回复!
答案 0 :(得分:30)
正如puce所说,你必须使用Task
或Service
来完成你在后台需要做的事情。并Platform.runLater
从后台线程中在JavaFX Application线程中执行操作。
您必须同步它们,其中一种方法是使用类CountDownLatch
。
以下是一个例子:
Service<Void> service = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
//Background work
final CountDownLatch latch = new CountDownLatch(1);
Platform.runLater(new Runnable() {
@Override
public void run() {
try{
//FX Stuff done here
}finally{
latch.countDown();
}
}
});
latch.await();
//Keep with the background work
return null;
}
};
}
};
service.start();
答案 1 :(得分:7)
如果您想在后台执行某些操作,请使用JavaFX应用程序主题中的Worker
(Task
,Service
。
http://docs.oracle.com/javafx/2/api/javafx/concurrent/package-summary.html
如果要在JavaFX应用程序线程上执行某些操作,请使用后台线程中的Platform.runLater
。
答案 2 :(得分:0)
现在回答为时已晚,但对于那些有错误的人,这是解决方案XD
您可以使用一个线程。
对线程中的 runnable
和 runlater
使用 lambda 表达式。
Thread t = new Thread(() -> {
//Here write all actions that you want execute on background
Platform.runLater(() -> {
//Here the action where is finished the actions on background
});
});
t.start();