执行进程

时间:2016-07-14 19:27:33

标签: user-interface javafx concurrency updates fxml

我发现当我点击"开始"我的GUI在3-4秒后开始冻结按钮喜欢"没有回复"。当我继续点击应用程序时,它被迫关闭 现在我想阻止这一点,但我不知道如何。据我所知,JavaFX在单线程中运行,因此,在执行方法时更新我的​​TextArea,我需要在另一个线程中运行这些方法。
我希望有人可以帮助我。

我的项目如何?

我有一个FXML,一个控制器,一个处理程序,一个Transformer,一个Writer和一个Reader类(在Handler类中使用)。
当我单击与Controller中的方法绑定的按钮时,会创建一个Handler实例,这个实例调用Reader读取文本文件,转换为字符串列表(逐行)。
此外,这些线路也受到了操纵。在此之后,Writer用于创建新文件并将新的操纵行写入此文件 它也允许用户引用不止一个文件 我想要的是每当读者开始阅读像#34这样的文件时,textarea就会显示;文件......正在阅读"。
然后附加"文件......正被操纵"当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?

信息 :我知道Handler在编辑List&#34;文件&#34;的初始化时不会编译。其中包含文件路径的字符串。

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

1 个答案:

答案 0 :(得分:5)

您应该在后台线程中执行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应用程序线程上。可能最干净的方法是在Platform.runLater()类中不要Handler,而是在Handler中定义一个字段,用于&#34;消费&#34;状态消息:

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")));
按钮处理程序方法中的