2012-12-08 59 views
1

此代码正确构建,一切似乎都正常,但密钥无所作为。我认为它不是动作侦听器就是椭圆形没有更新。我正在尝试通过初学者java游戏编程工作。我相信这很容易,但我没有抓住它。如果这有所作为,我会在崇高的文本2中使用mac。KeyPressed事件没有发生?

package javagame; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class JavaGame extends JFrame { 

int x, y; 

public class AL extends KeyAdapter { 

    public void keyPressed(KeyEvent e) { 
     int keycode = e.getKeyCode(); 
     if(keycode == e.VK_LEFT); { 
      x-= 3; 
     } 
     if(keycode == e.VK_RIGHT); { 
      x+= 3; 
     } 
     if(keycode == e.VK_UP); { 
      y-= 3; 
     } 
     if(keycode == e.VK_DOWN); { 
      y+= 3; 
     } 
    } 


    public void keyReleased(KeyEvent e) { 

    } 
} 

public JavaGame() { 
    addKeyListener(new AL()); 
    setTitle("Jave Game"); 
    setSize(700, 700); 
    setResizable(false); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    x = 350; 
    y = 350; 
} 

public void paint(Graphics g) { 
    g.fillOval(x, y, 15, 15); 

    repaint(); 
} 

public static void main(String[] args) { 
    new JavaGame(); 
} 

} 
+1

如有疑问,请简化问题。首先验证你是通过'System.out.println'语句进入'keyPressed',然后按下右键,最后如果你正在更新绘制blob。 – PearsonArtPhoto

+0

改为使用KeyBindings – mKorbel

回答

6

您需要从if语句删除分号:

if (keycode == e.VK_LEFT) 
{ 
    x-= 3; 
} 

目前是按照你的if语句代码块呈现独立的分号终止这些语句。


一些Swing特异性注意事项:

  • 这是更好地使用paintComponent从子类JComponent更好的油漆 性能。
  • 使用Key bindings超过KeyListener改善关键事件管理。这是一个example
+0

你应该给他看一个简单的例子,说明如何使用Key绑定。 – brimborium

+0

哇,我甚至不知道为什么我把那些放在那里。谢谢我认为这是明显的。我很欣赏快速的回答和有用的链接,我对编码真的很陌生,但至少我会好一点。 – SavgStorm

+0

@SavgStorm每个人都通过练习越来越好。不仅是“新”的。学习编码的最佳方式(在我看来)是实际编码。所以我想你是在正确的轨道上。 ;) – brimborium

2

即使有建议的更正,你仍然会有可能的问题。

首先,JFrame实际上包含许多组件,它们是根窗格,其中包含内容和分层窗格以及玻璃窗格(通常不可见)。如果这些组件中的任何一个因任何原因获得了关键主板的焦点,那么您的关键监听器可能会被忽略。

更好的解决方案是使用key bindings API,它可以更好地控制焦点问题。

您也违反了油漆合同。在大多数情况下,您需要致电super.paint,实际上,您不鼓励您重写顶层容器的涂装方法,而应从JPanel之类的东西延伸,并覆盖其paintComponent方法。

这些绘画方法执行非常重要的工作,你不应该忽略/略过它们。请参阅Painting in AWT and SwingCustom Painting in Swing以获取更多信息

+0

我认为他这样做是为了简单。但是,我认为这很不合适,它只是教会在屏幕上移动某些东西的基本想法。下一个教程切换到使用图像和线程。谢谢你的信息。 – SavgStorm