我目前正在开发一款名为 osu! 的节奏游戏附加组件。使用Java。涉及多个窗口,但在为其中一个窗口调用 actionPerformed 事件监听器后,它会创建另一个窗口,该窗口创建一个对象,该对象的构造函数调用两个方法,每个方法都使用 BufferedReader。但是,一旦我单击 actionPerformed 按钮,程序就会挂起并卡住,直到从任务管理器终止。以下是 GUI 窗口的 actionPerformed 代码:
private void btnCreateActionPerformed(ActionEvent evt) throws IOException {
String text = textBeats.getText();
if (text == null) {
JOptionPane.showMessageDialog(contentPane, "Please enter a positive number.");
}
boolean isNumber = true;
for (char c : text.toCharArray()) {
if (!Character.isDigit(c)) {
isNumber = false;
} else if (c == '-') {
isNumber = false;
}
}
if (isNumber) {
double beats = Double.parseDouble(text);
WindowCode window = new WindowCode(drawArea, file, beats);
window.setVisible(true);
this.dispose();
} else {
JOptionPane.showMessageDialog(contentPane, "Please enter a positive number.");
}
}
下面是创建 WindowCode 时调用的两个方法:
public double[] getLastTimingPoint() {
String line;
String timings[] = new String[8];
double pointElements[] = new double[8];
boolean isTiming = false;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(osuFile), "UTF-8"))){
while ((line = reader.readLine()) != null) {
if (line.contains("[TimingPoints]")) {
isTiming = true;
} else if (line.contains("[Colours]") || line.contains("[HitObjects]")) {
isTiming = false;
}
if (isTiming) {
if (!line.contains("[TimingPoints]") && !line.contains("[Colours]") && !line.contains("[HitObjects]") && line.length() > 0) {
timings = line.split(",");
}
}
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < timings.length; i++) {
pointElements[i] = Double.parseDouble(timings[i]);
}
System.out.println("1");
return pointElements;
}
public double[] getLastInheritedPoint() {
String line;
String timings[] = new String[8];
double pointElements[] = new double[8];
boolean isTiming = false;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(osuFile), "UTF-8"))) {
while ((line = reader.readLine()) != null) {
if (line.contains("[TimingPoints]")) {
isTiming = true;
}
while (isTiming) {
if (!line.contains("[TimingPoints]") && !line.contains("[Colours]") && !line.contains("-")) {
timings = line.split(",");
}
}
}
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < timings.length; i++) {
pointElements[i] = Double.parseDouble(timings[i]);
}
System.out.println("2");
return pointElements;
}
我尝试打印出检查点编号,但它只在控制台上打印“1”,这让我相信这是第二种方法导致的。我的问题是 BufferedReader 是否会以某种方式影响 EDT,如果确实如此,我应该如何解决它。
最佳答案
在第二种方法中,您有这个内部循环:
while (isTiming) {
if (!line.contains("[TimingPoints]") && !line.contains("[Colours]") && !line.contains("-")) {
timings = line.split(",");
}
}
如果正在读取的文件包含此字符串“[TimingPoints]”,则变量 isTiming 将设置为 true,并且没有其他人将其重置回 false,从而陷入无限循环。
您应该修改该循环逻辑。
关于java - BufferedReader 导致 Java GUI 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41023313/