【发布时间】:2016-07-21 09:47:45
【问题描述】:
我正在制作一个读取文本文件的程序。我想要做的是显示在文件读取之前或期间在单独的线程中创建的任意节点(警报或其他节点)。我尝试像这样使用Task 和Platform.runLater():
if (filetoopen != null)
{
Platform.runLater(new Runnable() {
@Override
void run() {
Alert alert=new Alert(Alert.AlertType.INFORMATION)
alert.setHeaderText('TEST')
}
})
//method to read the file
Tools.convertFromFile(filetoopen,newredactor)
lastDirectory = filetoopen.getParentFile()
}
我想显示读取文件的警报或进度条,但控件在读取完成后初始化。那么,是否可以在读取文件时显示带有进度条的节点?还是我创建的 Runnable 会一直执行到最后?
编辑:对任务的尝试:
class Alerter extends Task{
Alerter(File f,Editor e)
{
file=f
editor=e
}
File file
Editor editor
@Override
protected Object call() throws Exception {
Dialog dialog=new Dialog()
DialogPane dp=dialog.getDialogPane()
dp.setHeaderText('TEST')
dp.getButtonTypes().add(new ButtonType('Cancel',ButtonBar.ButtonData.CANCEL_CLOSE))
dialog.setOnCloseRequest(new javafx.event.EventHandler<DialogEvent>() {
@Override
void handle(DialogEvent event) {
dialog.close()
}
})
dialog.show()
Tools.convertFromFile(file,editor)
return null
}
}
对话框在Tools.convertFromFile之后仍然初始化。
【问题讨论】:
-
“我尝试使用
Task和Platform.runLater()”:这是正确的做法,但您发布的代码中没有Task。 -
好的,我添加了一个Task的尝试
-
查看 controlsFX 和 ProgressDialog。你给它发送一个任务,然后启动它,它就会显示你需要的东西。
-
您的
Task版本在后台线程上创建并显示Dialog,这违反了JavaFX 线程规则。看我的回答。