所以我想将String移向用户推动的方向,但它不起作用。它与mouselistener一起工作,所以我认为这是足够的。我应该将听众添加到其他内容吗?
public class Snake extends JComponent implements KeyListener{
private int x;
private int y;
private String s;
public Snake(String s, int x, int y){
this.s = s;
this.x = x;
this.y = y;
addKeyListener(this);
}
@Override
protected void paintComponent(Graphics g) {
g.drawString(s, x, y);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch(code) {
case KeyEvent.VK_UP:
y-=15;
case KeyEvent.VK_DOWN:
y+=15;
case KeyEvent.VK_RIGHT:
x+=15;
case KeyEvent.VK_LEFT:
x-=15;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
}
public class Game {
public static void main(String[] args){
JFrame frame = new JFrame("Up Up And Away!");
JComponent star = new Snake("*", 250, 100);
frame.add(star);
frame.setSize(500, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
答案 0 :(得分:1)
正如其他人提到的那样。使用Key Bindings可能更好。但是在你的情况下,你的焦点在其他地方,所以你的组件只需要抓住焦点。只需在主要内容中添加 star.grabFocus(); 即可。即:
public static void main(String[] args){
JFrame frame = new JFrame("Up Up And Away!");
JComponent star = new Test2("*", 250, 100);
frame.add(star);
frame.setSize(500, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
star.grabFocus();
}
然后它应该工作。
答案 1 :(得分:1)
您的KeyListener
已应用于JComponent
但未应用于JFrame,当您运行程序时,JFrame具有焦点(只有JFrame可以侦听KeyEvents),将以下行添加到您的游戏中那么它应该工作:)
frame.addKeyListener((KeyListener)star);