试图制作基于Ascii的游戏; JFrame没有显示

时间:2013-06-28 21:24:14

标签: java swing jframe ascii

我已经坚持了很长时间。

所以我正在使用某人的AsciiPanel库。这是一个库,当AsciiPanel添加到JFrame时,将创建一个带有Ascii图形的80x24旧式Windows命令行(用于roguelikes等)。

我正在尝试将AsciiPanel添加到JFrame。

问题是,我不认为我在任何地方创建了JFrame。我不想把它添加到任何奇怪的地方并使代码不可读/非常规以后,所以我决定在这里询问社区。这是代码:

package com.base.engine;


import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import com.base.game.Game;
import asciiPanel.AsciiPanel;


public class Main extends JFrame{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static AsciiPanel asciiPanel;
    private static Game game;
    public boolean gameRunning = true;

    public Main() {
        initDisplay();
        initGame();
        gameLoop();
    }

    private void initDisplay() {
        asciiPanel = new AsciiPanel();
        add(asciiPanel);
        pack();
    }
    private static void initGame() {
        // TODO Auto-generated method stub
        game = new Game();
    }
    private void gameLoop() {
        while(gameRunning = true) {
            game.getInput();
            game.update();
            game.redraw();
        }   
    }

    void windowClosing(WindowEvent e) {
        gameRunning = false;
    }

    public static void main(String[] args) {
        Main game = new Main();
        game.setDefaultCloseOperation(EXIT_ON_CLOSE);
        game.setVisible(true);
    }
}

我也认为gameLoop()可能是搞砸了,因为我认为它在我添加它之前工作正常。

感谢您提供任何信息。

1 个答案:

答案 0 :(得分:3)

你是对的,你的游戏循环阻止事件调度线程,阻止它处理重绘请求或传入事件。

根据您的需求,您最好使用javax.swing.TimerSwingWorkerThread

请查看Concurrency in Swing了解详情

要记住的是,Swing是单线程框架,这意味着所有UI组件的所有创建和更新都应该在EDT的上下文中发生。

同样,任何阻止EDT的操作都会阻止它更新UI(或处理事件)