JavaFX FileReader读取行gui show counter

时间:2014-12-31 20:20:28

标签: 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 freezy ..

我如何在任务中修复此问题?

我是新手:(

抱歉我的英语。

再次简短:

我有1个标签 filechooser即加载txt文件 标签必须显示每行后读取的行数

1 个答案:

答案 0 :(得分:2)

请在此处查看问题和答案: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;
    }

}