【发布时间】:2014-11-17 15:24:34
【问题描述】:
我正在从文件中读取内容并将其显示到 GUI。
这是我的文件:
Log ; ytr
Thread Sleep ; 654
Log ; hgfd
Thread Sleep ; 543
Log ; hgfd
Thread Sleep ; 7654
Log ; grdr
我选择了一个文件,它会读取该文件,然后同时更新 GUI。所以有一个按钮可以让我选择我的文件。以上是我的一个文件的示例,我读过它,如果它的“日志”是输出到 GUI 的任何内容。
我正在log 函数中进行多线程处理
这里更新是我的全部(相关)代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
public class HelloWorld extends Application {
final static TextArea m_text_area = new TextArea();
final static GridPane m_grid = new GridPane();
final FileChooser fileChooser = new FileChooser();
static String parameters = "";
final static Scene m_scene = new Scene(m_grid, 500, 500);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Choose your file...");
m_grid.add(m_text_area, 0, 1);
m_grid.add(btn, 0, 0);
final String thread_sleep = "Thread Sleep";
final String log = "Log";
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
List<File> list = fileChooser
.showOpenMultipleDialog(primaryStage);
if (list != null) {
for (File file : list) {
if (file.isFile()) {
if (file.getName().indexOf(".") != 0) {
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader(file
.getAbsolutePath().toString()));
int i = 0;
while ((sCurrentLine = br.readLine()) != null) {
if (!sCurrentLine.startsWith("#")) {
String line[] = sCurrentLine
.split(";");
String command = line[0].trim();
try {
parameters = line[1].trim();
} catch (Exception e5) {
}
switch (command) {
case thread_sleep: {
Thread.sleep(Integer
.parseInt(parameters));
break;
}
case log: {
log(parameters);
break;
}
}
}
}
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
}
}
}
});
primaryStage.setScene(m_scene);
primaryStage.show();
}
public static void log(String text) {
final String textToDisplay = text;
Platform.runLater(new Runnable() {
@Override
public void run() {
m_text_area.appendText(textToDisplay + "\n");
}
});
}
}
我的问题:GUI 冻结并仅更新整个程序已执行的一个
【问题讨论】:
-
向我们展示整个代码。不能用那个调试任何东西
-
这里没有足够的代码来确定发生了什么。你能用更小的MCVE 重现这个问题吗?
-
您忘记了第一个 case 语句中的中断,因此它继续尝试解析 Thread.sleep(Integer.parseInt(split[1])); 中的非整数的第二种情况。
-
对不起,这是一个错误。生病只是快速给出相关代码。
-
我没有看到任何多线程。所以很明显,你的单线程不能同时做两件事,处理你的文件和更新你的 UI。
标签: java multithreading javafx