JavaFX FileRader 读取行 gui 显示计数器

标签 java javafx counter filereader freeze

我有一个小问题。

这是我的代码

package email;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.FileChooser;

public class Controller {

@FXML
public static Label daten;


@FXML
public static Button Datei;

@FXML
public TextField Trennzeichen;

static int i = 0;


@FXML
public void Datei(ActionEvent event) throws IOException, InterruptedException {

FileChooser fileChooser = new FileChooser();
File file = fileChooser.showOpenDialog(null);

FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
fileChooser.getExtensionFilters().add(extFilter);

String[] buffer = new String[9];
String[][] data = new String[2000][9];

try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String zeile = reader.readLine();
while (zeile != null) {
if ((zeile.substring(0, 1).equals("I")) || (zeile.substring(0, 1).equals("-"))) {
System.out.println("ha");
} else {

buffer = zeile.split(Trennzeichen.getText());

for (int t = 0; t < buffer.length; t++) {
data[i][t] = buffer[t];
}
++i;
daten.setText("" + i);

}
zeile = reader.readLine();
}

} catch (IOException e) {
e.printStackTrace();
}

}
}

我的 GUI 上有一个标签,它必须显示我的 txt 文件中有多少行。

这工作正常,但它不是实时的,工作后 gui 更新,之前是 gui 卡住..

如何在任务中解决这个问题?

再次简短:

我有 1 个标签 文件选择器,加载 txt 文件 标签必须显示每行之后正在读取多少行

最佳答案

请在此处查看问题和我的答案:Display progress bar while compressing video file

JavaFX 是一个单线程 GUI 工具包,如果您在 GUI 线程上执行长时间运行的任务,它将卡住。因此,您应该将文件读取移至后台任务,如链接问题中所述。

<小时/>

编辑:示例骨架解决方案

public void readFile() {
    Label counter = new Label();
    ReadFileTask task = new ReadFileTask();
    counter.textProperty().bind(task.progressProperty().asString());
    new Thread(task).start();
}

public class ReadFileTask extends Task<Void> {

    @Override
    protected Void call() throws Exception {

        File file = new File(pathname); //TODO
        long lines = Files.lines(file.toPath()).count();
        long line = 0;
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String zeile = null;
        while ((zeile = reader.readLine()) != null) {
            //TODO do the work

            updateProgress(line++, lines);
        }

        return null;
    }

}

关于JavaFX FileRader 读取行 gui 显示计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725991/

相关文章:

c++ - 计数器函数不建立在先前返回的值之上

html - 如何在 :hover detection? 之后保持计数器递增

java - Jersey 客户端 API 已支持 JAX-RS 2.0?

java - 如果在静态初始化 block 中创建线程,程序将挂起

java - 为什么锁对象和条件队列对象必须是同一个对象?

java - 如何简单地实现一个 KeyListener?

JavaFX、tableview 和数据库表

java - Gluon *Mobile* JavaFX 为 IOS 和 Android 公开哪个 Java 发行版 'level' - 即完整 JavaSE(桌面)或 Android?

javascript - 无效的正则表达式 : Nothing to Repeat Error

JavaFX 应用程序图标无法显示 9/10 次