用户界面 - 在执行进程时更新文本区域



>我发现当我单击"开始"按钮(如"无响应")时,我的 GUI 在 3-4 秒后开始冻结。当我继续单击该应用程序时,它被迫关闭。
现在我想防止这种情况,但我不知道如何。据我所知,JavaFX 在单个线程中运行,因此,要在执行方法时更新我的 TextArea,我需要在另一个线程中运行这些方法。
我希望有人能帮助我。

我的项目是什么样的?

我得到了一个FXML,一个控制器,一个处理程序,一个转换器,还有一个Writer和一个Reader类(在处理程序类中使用)。
当我单击绑定到控制器中的方法的按钮时,将创建一个 Handler 实例,并且该实例调用 Reader 以读取文本文件,转换为字符串列表(逐行)。
此外,这些线条正在纵。在此之后,编写器用于创建一个新文件并将新的操作行写入该文件。
还允许用户引用多个文件。
我想要的是,每当读者开始阅读诸如"文件......正在阅读"。
然后附加"文件...正在纵"当变形金刚开始行动时,然后
"文件...正在写入",当新行写入新文件时。

这是一些代码..
控制器:

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));
    }
}

每当读取、操作或写入文件时,我应该如何更改代码以更新文本区域?

信息:我知道类处理程序不会编译,因为我删除了包含文件路径字符串的列表"文件"的初始化。

如果我遗漏了相关信息,请随时询问。
我提前谢谢你!

您应该在后台线程中执行 handle() 方法:

@FXML
private void handleButtonAction(ActionEvent event) {
    System.out.println("You clicked me!");
    Thread thread = new Thread(() -> {
        Handler hand = new Handler();
        hand.handle(files);
    });
    // this line means the background thread will not prevent application exit:
    thread.setDaemon(true);
    thread.start();
}

如果要使用当前状态更新文本区域,则需要使用 Platform.runLater() 在 FX 应用程序线程上重新安排该状态。可能最干净的方法是不要在 Handler 类中包含 Platform.runLater(),而是在 Handler 中定义一个用于"使用"状态消息的字段:

public class Handler {
    private final Consumer<String> statusMessageProcessor ;
    public Handler(Consumer<String> statusMessageProcessor) {
        this.statusMessageProcessor = statusMessageProcessor ;
    }
    // default processor does nothing:
    public Handler() {
        this(s -> {});
    }
    public void handle(List<String> files) {
        for (String s : files) {
            // similarly for other status updates:
            statusMessageProcessor.accept("The file "+s+" is being read");
            List<String> ls = Reader.readFile(s);
            Writer.writeFile(Transformer.transform(ls));
        }
    }
}

然后

Handler hand = new Handler() ;

可以成为

Handler hand = new Handler(message -> 
    Platform.runLater(() -> console.appendText(message + "n")));

在按钮处理程序方法中。

最新更新