我尝试创建一个基本的Snake游戏。首先,将开始屏幕显示为JPanel,并且当用户单击“开始”按钮时,该面板将对“ .setVisible(false)”不可见,并且gameScreen(也是JPanel)也将可见。但是在我最小化和最大化窗口之前,在GameScreen类中使用的KeyListener无效。我认为我对第一个clase设置有问题。
JFrame window = new JFrame("Snake");
window.setUndecorated(true);
window.setLayout(null);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setResizable(false);
window.setBounds(0, 0, 720, 480);
StartScreen startScreen = new StartScreen(frameWidth, frameHeight);
startScreen.setBounds(0, 0, frameWidth, frameHeight);
startScreen.setVisible(true);
window.add(startScreen);
window.setVisible(true);
while(startScreen.isVisible()){// I know it's bad way but I don't know the better one
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Core.class.getName()).log(Level.SEVERE, null, ex);
}
}
Game gameScreen = new Game(frameWidth, frameHeight, startScreen.getIsClassic());
gameScreen.setBounds(0, 0, frameWidth, frameHeight);
window.add(gameScreen);
gameScreen.setVisible(true);
window.setVisible(true);
是从我的主类创建的,我创建了JFrame并向其中添加了JPanels。
public Game(int weight, int height, boolean isClassic) {
super();
this.setLayout(null);
this.setFocusable(true);
// some other thing about game
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Yo ho!");
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}
这是扩展JPanel的Game类的构造函数。
我有什么问题?
无法做您想做的事情,因为KeyEvent
之类的事件仅在它们具有焦点时才传递给组件。您应该对OS进行控制,以捕获非焦点窗口的事件,但是出于安全原因,Java禁止这样做。此外,每个操作系统对事件的处理方式都不同于其他操作系统,因此很难统一VM的行为。有些人可以尝试做一些技巧,但是每种解决方法都可能导致行为异常。