在Java中移动对象(按键)
对于我在学校的项目,我们必须做一个游戏 我试图用箭头键移动一个对象,但如果我运行它并按下其中一个键,什么也不会发生 我是否实现了addKeyListenerthis;在错误的地点在Java中移动对象(按键),java,keypress,keylistener,Java,Keypress,Keylistener,对于我在学校的项目,我们必须做一个游戏 我试图用箭头键移动一个对象,但如果我运行它并按下其中一个键,什么也不会发生 我是否实现了addKeyListenerthis;在错误的地点 package VoorbeeldSpel; import java.awt.Graphics; import java.awt.Image; import java.awt.event.*; import javax.swing.*; public class PlayPanel extends JPanel
package VoorbeeldSpel;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.*;
import javax.swing.*;
public class PlayPanel extends JPanel implements ActionListener, KeyListener {
private static final long serialVersionUID = 584263623777101573 L;
final static String IMAGE_FOLDER = "images/";
final static String FILE_FOLDER = "files/";
private Timer spelTimer = new Timer(50, this); // elke 1000 milliseconden zal een event gelanceerd worden
private JButton menuKnop;
private MijnProject mainVenster;
MusicPlayer music;
private Image ninjaImage;
private Image BackgroundImage;
public int pos_x, pos_y;
public int v_x, v_y;
private String inputText = "";
public PlayPanel(MijnProject mainVenster) {
this.mainVenster = mainVenster;
menuKnop = new JButton("Menu");
menuKnop.addActionListener(this);
this.add(new JLabel("We are playing ... "));
this.add(menuKnop);
addKeyListener(this);
// Music player laden
music = new MusicPlayer("nyancat-loop.wav", true);
// Prentjes laden
ninjaImage = new ImageIcon(getClass().getResource(IMAGE_FOLDER + "ninja.png")).getImage();
BackgroundImage = new ImageIcon(getClass().getResource(IMAGE_FOLDER + "Backgroundmenu.jpg")).getImage();
spelTimer.start(); // hier starten we de gameloop
}
// we gaan init aanroepen nadat we dit JPanel aan het frame hebben toegevoegd
// op dit moment zijn de hoogte en breedte van het panel bepaald en kunnen we de pos_x en pos_y variabelen initialiseren als het midden van het scherm
public void init() {
addKeyListener(this);
v_x = ;
v_y = 0;
pos_x = getWidth() / 2;
pos_y = getHeight() / 2;
addKeyListener(this);
}
public void gameloop() {
pos_x += v_x;
pos_y += v_y;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(BackgroundImage, this.getWidth() / 50, this.getHeight() / 50, mainVenster.getWidth(), mainVenster.getHeight(), this);
g.drawImage(ninjaImage, pos_x, pos_y, 60, 60, this);
g.drawChars(inputText.toCharArray(), 0, inputText.length(), 25, getHeight() / 2);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == menuKnop) {
mainVenster.switchPanel();
music.stop();
spelTimer.stop(); // stoppen van het spel
} else if (ae.getSource() == spelTimer) {
gameloop();
addKeyListener(this);
System.out.println("De volgende stap van het spel wordt uitgevoerd...");
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
v_x = 0;
v_y = -5;
case KeyEvent.VK_DOWN:
v_x = 0;
v_y = 5;
case KeyEvent.VK_RIGHT:
v_x = 5;
v_y = 0;
case KeyEvent.VK_LEFT:
v_x = -5;
v_y = 0;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
int Keycode = e.getKeyCode();
switch (Keycode) {
case KeyEvent.VK_UP:
v_x = 0;
v_y = 0;
case KeyEvent.VK_DOWN:
v_x = 0;
v_y = 0;
case KeyEvent.VK_RIGHT:
v_x = 0;
v_y = 0;
case KeyEvent.VK_LEFT:
v_x = 0;
v_y = 0;
}
repaint();
}
}
这可能是因为KeyListener仅在组件被聚焦时接收KeyEvent。有一些建议可能会为您解决问题;但是我不推荐它们,因为它们很笨重。我没有看到的另一个棘手的解决方案是将密钥侦听器添加到JFrame中,然后在任何可能偷走焦点的组件上使用setFocusablefalse和setFocusTraversalKeysEnabledfalse。如果要向UI添加其他组件,如JButton和JTextField,则关键侦听器尤其棘手
更好的解决方案是使用Swing键绑定,它在处理焦点系统时不会出现问题。一个问答,解释了他们的一些动机,还有一个问题。您可以使用WHEN_IN_FOCUSED_窗口标志来保证无论哪个组件具有焦点,键绑定都会启动。我怀疑您是否需要在每个循环迭代中添加键侦听器,因为侦听器太多,或者如果内部代码正常,它只会忽略您的请求,并且只有一个听众。非常感谢您的回答,但是当我在尝试解决问题时,我看到了一个名为。requestFocusable。这对我起了作用。但还是非常感谢你花时间来帮助我。是的,这是我不推荐的解决方案之一。例如,如果您在框架中添加了一个JButton,而有人单击了它,那么JPanel将失去焦点并再次停止发送关键事件。