【发布时间】:2016-07-14 19:27:33
【问题描述】:
我发现当我单击“无响应”等“开始”按钮时,我的 GUI 在 3-4 秒后开始冻结。当我继续点击应用程序时,它会被强制关闭。
现在我想阻止这种情况,但我不知道如何。据我所知,JavaFX 在单线程中运行,因此,要在方法执行时更新我的 TextArea,我需要在另一个线程中运行这些方法。
我希望有人可以帮助我。
我的项目是什么样子的?
我有一个 FXML、一个 Controller、一个 Handler、一个 Transformer ,还有一个 Writer 和一个 Reader 类(在 Handler 类中使用)。
当我单击绑定到控制器中的方法的按钮时,将创建一个 Handler 实例,并调用 Reader 读取文本文件,并转换为字符串列表(逐行)。
此外,线条正在被操纵。在此之后,Writer 用于创建一个新文件并将新操作的行写入该文件。
还允许用户引用多个文件。
我想要的是,每当读者开始阅读诸如“文件...正在阅读”之类的文件时,都会显示文本区域。
然后在 Transformer 开始动作时附加“文件...正在被操作”,然后
当新行写入新文件时,“文件...正在写入”。
这是一些代码..
控制器:
public class FXMLDocumentController implements Initializable {
@FXML
private TextArea console;
@FXML
private void handleButtonAction(ActionEvent event) {
System.out.println("You clicked me!");
Handler hand = new Handler();
hand.handle(files);
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
处理程序:
public class Handler {
public void handle(List<String> files) {
for (String s : files) {
List<String> ls = Reader.readFile(s);
Writer.writeFile(Transformer.transform(ls));
}
}
每当读取、操作或写入文件时,我应该如何更改我的代码以更新 TextArea?
信息:我知道类处理程序不会编译,因为我删除了包含文件路径字符串的列表“文件”的初始化。
如果我遗漏了相关信息,请随时询问。
提前谢谢你!
【问题讨论】:
-
您应该查看并发包中的任务和服务:docs.oracle.com/javafx/2/threads/jfxpub-threads.htm。还有Platform.runLater().
标签: user-interface javafx concurrency updates fxml