JFrame 不会关闭

JFrame Won't Close

我正在进行一个个人项目,以试验 2D 物理。现在,我正在尝试设置 JFrame,使其每秒更新 60 次。但是,当我调用方法开始更新 JFrame 时,我无法关闭 JFrame。但是如果我省略调用方法的部分,我可以关闭 JFrame。这是主要代码:


import javax.swing.JFrame;

import utils.Frame;

public class Engine {

    Frame w;
    
    boolean running = false;
    JFrame f;
    
    public void start() {
        init();
        updater();
    }
    
    public void init() {
        
        w = new Frame();
        
        running = true;
        f = w.create(500, 500, "Work please");
        
    }
    
    public void updater() {
        
        int fps = 60;
        double timePerTick = 1000000000 / fps;
        double delta = 0;
        long now;
        long lastTime = System.nanoTime();
        long timer = 0;

        while (running) {
            now = System.nanoTime();
            delta += now - lastTime;
            timer += now - lastTime;
            lastTime = now;

            if (delta >= timePerTick) {
                //render
                delta -= timePerTick;
            }

        }
    }
    
}

这是框架的代码:


import javax.swing.JFrame;

public class Frame {

    public JFrame create(int width, int height, String title) {

        JFrame f = new JFrame();
        f.setSize(width, height);
        f.setTitle(title);
        f.setLocationRelativeTo(null);
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        
        return f;
    }

}

如果我不在 start() 中调用 updater(),我可以关闭 JFrame。我知道我离开 运行ning = true,但它应该仍然关闭,因为它可以在我的旧计算机上运行。即使我需要使 运行ning = false,我也已经尝试通过将 WindowListener 添加到 Frame 中的 f 来实现。它会调用一个方法使 运行ning = false,但由于某种原因,当我按下关闭按钮时 WindowListener 不会激活。提前谢谢你的帮助。如果这对您有任何帮助,我必须从网站下载 Eclipse IDE 的直接包,因为每次我使用安装程序时,每个项目都会收到错误“无法初始化 ct.sym ..." 出于某种原因,当我 运行 一个带有 JFrame 的 Java 程序时,Java 吉祥物“Duke”显示为图标,一直让我失望。

确保你有两种方法来控制程序是否运行。

但是请确保使用 -

同步这两种方法
synchronized

-关键字。

public synchronized void start() {
    if (running) return;
    running = true;
    thread = new Thread(this);
    thread.start();
}

public synchronized void stop() {
    if (!running) return;
    running = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}