java - 单击 "X"按钮时 JFrame 不会关闭

标签 java swing loops jframe

单击默认的“X”按钮时,JFrame 不会关闭。我认为这个问题与主线程没有被读取有关,但我不理解 swing 的复杂性,或者老实说,一般的线程。 “Window”是JFrame的扩展,“Boxy”驱动程序。该计划仅处于初始阶段。另外,我想知道如何让主线程在每次循环时都运行。在其他问题中找不到与此相关的任何信息。

public class Window extends JFrame implements KeyListener{
    private static final long serialVersionUID = 1L;
JPanel panel;
public Window(){
    super("FileTyper");
    super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    super.setSize(200,100);
    super.setResizable(false);
    panel = new JPanel();
    super.getContentPane().add(panel);
    super.setFocusable(true);
    addKeyListener(this);

    super.setVisible(true);
}
public void update(){

}
public void render(Graphics2D g){

}
@Override
public void keyPressed(KeyEvent e) {

}
@Override
public void keyReleased(KeyEvent e) {
    switch(e.getKeyCode()) {
    case KeyEvent.VK_F9:
        break;
    case KeyEvent.VK_F10:
        break;
    }

}
@Override
public void keyTyped(KeyEvent arg0) {

}

public class Boxy {
public Window window;

public static void main (String args[]){
    start();
}
public Boxy(){
    init();
    boolean forever = true;
    while(forever){
        update();
        render();
        delay();
    }
}
private void init(){
    window = new Window();
}
private void update(){
    window.update();
}
private void render(){
    Graphics2D g2 = (Graphics2D) window.getContentPane().getGraphics();
    window.render(g2);
    g2.fillRect(0, 0, 100, 100);
}
private void delay(){
    try {Thread.sleep(20);} catch (InterruptedException ex) {System.out.println("ERROR: Delay compromised");}
}
public static void start(){
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Boxy box = new Boxy();
        }
    });
}
}

最佳答案

我建议你用

阻塞事件调度线程
while(forever){
    update();
    render();
    delay();
}

这会阻止事件队列处理关闭窗口的事件。

先看看 Concurrency in Swing .我建议您先看一下 javax.swing.Timer 之类的东西,但是如果您想更好地控制帧速率,则需要使用某种线程。不过请记住,Swing 期望所有更新都在事件调度线程的上下文中执行。

Swing 中的自定义绘画不是通过使用诸如...之类的东西来完成的

Graphics2D g2 = (Graphics2D) window.getContentPane().getGraphics();

Graphics 上下文是短暂的,您(使用此方法)对其绘制的任何内容都将在下一个绘制周期中被销毁。

相反,您应该使用类似 JPanel 的东西作为绘画的基础,并覆盖它的 paintComponent 方法并在调用时从其中呈现状态.

当您想要更新组件时,您只需调用 repaint

看看Performing Custom Painting了解更多详情。

我还建议您看一下 How to use Key Bindings作为 KeyListener

的替代品

关于java - 单击 "X"按钮时 JFrame 不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19579436/

相关文章:

java - 如何收听 JTextArea

java - JProgressBar 可以通过简单地增加 setValue 来更新吗?

java - 将选定的 Jtree 节点设置为 JTable

python - 从列表中选择的最佳方式

java - 程序接受单词作为 i/p,检查单词辅音/元音中的每个单个字符字母。条件 如果输入不是字母则打印错误消息

java - 无法 Autowiring 。未找到 'NoteRepository' 类型的 beans

java - Java 真的用空语句做些什么吗?

c++ - 当我运行此循环以打印字符串中的每个单词时,为什么会丢失一个值?

java - 缺少 Artifact org.apache.camel :camel-xmljson - JBOSS

java - 为什么 ComboBoxModel<E> 返回对象而不是 E