java - BufferedReader 导致 Java GUI 挂起

标签 java swing bufferedreader

我目前正在开发一款名为 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/

相关文章:

java - JLabel 图标抗拒改变

java - 如何让我的 MenuItems 从单独的类中调用方法?

Java使用方法从一个文件读取并写入另一个文件

java - 在 Eclipse 插件中动态更改弹出窗口

java - 我可以在开放源代码项目中使用VTD-XML解析器并将其与开放源代码一起发布吗?

java - Spring Hibernate 在 Google App Engine 上给出 LazyInitializationException

java - 使用 CascadeType 进行复制

java - 聊天应用程序无法在java中的不同WIFI连接上运行

java - 打印奇数行时出现问题

java - 初始化 BufferedReader (JAVA)