此代码构建正确,一切似乎都有效,但密钥无效。我认为它是动作监听器或椭圆形不更新。我正在尝试通过初学者java游戏编程。我相信这很容易,但我没有抓住它。如果这有所不同,我在sublime text 2中使用mac。
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();
}
}
答案 0 :(得分:6)
您需要从if
语句中删除分号:
if (keycode == e.VK_LEFT)
{
x-= 3;
}
目前,随着分号终止这些陈述,跟随if
语句的代码块将被释放。
一些Swing
- 具体说明:
paintComponent
的{{1}}来获得更好的颜色
性能JComponent
来改善关键事件管理。这是example。答案 1 :(得分:2)
即使有建议的更正,您仍然可能会遇到问题。
首先,JFrame
实际上包含了许多组件,即根窗格,其中包含内容和分层窗格以及玻璃窗格(通常是不可见的)。如果这些组件中的任何一个因任何原因获得了键盘焦点,那么关键监听器可能会被忽略。
更好的解决方案是使用key bindings API,它可以更好地控制焦点问题。
你也违反了油漆合同。在大多数情况下,您需要调用super.paint
,事实上,不鼓励您覆盖顶级容器的绘制方法,而是从JPanel
扩展并覆盖其paintComponent
。而不是1}}方法。
这些绘画方法执行非常重要的工作,你不应该轻易忽略/跳过它们。请查看Painting in AWT and Swing和Custom Painting in Swing了解详情