我已经坚持了很长时间。
所以我正在使用某人的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()可能是搞砸了,因为我认为它在我添加它之前工作正常。
感谢您提供任何信息。
答案 0 :(得分:3)
你是对的,你的游戏循环阻止事件调度线程,阻止它处理重绘请求或传入事件。
根据您的需求,您最好使用javax.swing.Timer
,SwingWorker
或Thread
。
请查看Concurrency in Swing了解详情
要记住的是,Swing是单线程框架,这意味着所有UI组件的所有创建和更新都应该在EDT的上下文中发生。
同样,任何阻止EDT的操作都会阻止它更新UI(或处理事件)