当前位置: 首页 > 知识库问答 >
问题:

JFrame无法关闭

怀浩大
2023-03-14

我正在做一个实验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;
            }

        }
    }
    
}

这是Frame的代码:


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。我知道我离开running=true,但它仍然应该关闭,因为这在我的旧计算机上可以工作。即使我需要使running=false,我也已经尝试过在Frame中为f添加一个WindowListener。它会调用一个方法,使running=false,但由于某种原因,当我按下关闭按钮时,WindowListener不会激活。提前感谢您的帮助。如果这对您有任何帮助,我必须从网站上直接下载Eclipse IDE包,因为每次使用安装程序时,每个项目都会出现错误“未能初始化ct.sym…”出于某种原因,当我运行一个带有JFrame的Java程序时,Java吉祥物“Duke”会显示为图标,而不是通常的Jar徽标,这让我很不舒服。

共有1个答案

柴华灿
2023-03-14

确保您有两个方法来控制程序是否正在运行。

但是,请确保使用-

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();
    }
}
 类似资料:
  • 问题内容: 我想知道是否有一种方法,通过单击“ X”,让程序在关闭JFrame之前执行一些代码。该方法仅使用整数。 问题答案: 您可能对使用感兴趣。本教程。

  • 我有一个带有登录名(JPanel)的JFrame,可以从菜单栏中选择。菜单栏还根据用户角色显示选项。当用户第一次登录创建的JFrame实例时,当我在菜单栏上选择login并在new JFrame上实例化时,我的问题就出现了,因为我显然打开了两个JFrame,我找不到从JPanel隐藏或关闭之前JFrame的方法。在实例化新JFrame或任何其他可能的解决方案之前,有没有办法隐藏/处理所有打开的窗口

  • 我有一个Jframe窗口,里面有一个按钮。通过单击该按钮,它将打开一个新的JFrame窗口。但是当我关闭这个窗口时,它会自动用按钮关闭第一个Jframe窗口。当我关闭第二个Jframe窗口时,如何防止第一个Jframe窗口关闭?

  • 问题内容: 我正在尝试制作一个在鼠标本地化处绘制一个圆的简单Java程序,它获取了鼠标的X和Y坐标,但是它没有绘制任何内容,我试图绘制一个String,一个圆和一条线,但是没有任何效果,我稍微修改了代码,但仍然无法正常工作 问题答案: 不要直接在上执行自定义绘画。如果可以,请始终在替代方法上进行操作。 为此,请勿使用无限循环。有用于Mouse Motion收听的

  • 嗨,我有一个jFrame,我想问问用户,当单击close按钮时,他是否确定要关闭jFrame: 当他从jpanel弹出窗口中选择“否”按钮时,我该如何撤消关闭操作?

  • 问题内容: 我创建了一个程序,可以在屏幕上移动一个球。我以前把所有内容都放在一个类中,但认为它看起来太乱了,所以我将其分为三个不同的类:Main …初始化所有内容,Game …绘制所有内容并为一个JPanel,AL则为一个KeyListener(这也是问题所在)。问题是,无论我尝试将其传递给我的类,我都无法从AL类获得重绘程序。有人能帮忙吗?这是我的三个班级: -- -- 问题答案: 让我们从显而