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();
}
}
我正在进行一个个人项目,以试验 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();
}
}