好吧,所以我在这里很沮丧。这里的这段代码只是一个非常简单的移动JComponent。
奇怪的是,当我什么都不改变时,keyPressed事件会非常不一致。我启动程序,有时它会起作用,我的球会在屏幕上移动。另一方面,我会在不更改任何内容的情况下关闭和打开它,它将无法工作。我不认为注意力集中是个问题,尽管我真的对此了解不多。我不知道发生了什么。
如有任何帮助,我们将不胜感激。我只是不明白这个项目怎么会如此前后不一地失败和成功。
这是我在角色类中的代码,因为我不认为只给你一个片段会有帮助。我不知道是只有我一个人,还是其他什么,但如果你想编译它并看看,那就继续吧。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Character extends JComponent implements KeyListener
{
Timer timer = new Timer(5, new TimeListener());
private int x = 250;
private int y = 300;
char whichTimer;
public Character()
{
addKeyListener(this);
setFocusable(true);
requestFocusInWindow();
repaint();
}
public void keyReleased(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_W)
{
timer.stop();
}
if(e.getKeyCode() == KeyEvent.VK_A)
{
timer.stop();
}
if(e.getKeyCode() == KeyEvent.VK_S)
{
timer.stop();
}
if(e.getKeyCode() == KeyEvent.VK_D)
{
timer.stop();
}
}
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_W)
{
timer.stop();
whichTimer = 'W';
timer.start();
}
if(e.getKeyCode() == KeyEvent.VK_A)
{
timer.stop();
whichTimer = 'A';
timer.start();
}
if(e.getKeyCode() == KeyEvent.VK_S)
{
timer.stop();
whichTimer = 'S';
timer.start();
}
if(e.getKeyCode() == KeyEvent.VK_D)
{
timer.stop();
whichTimer = 'D';
timer.start();
}
}
public void keyTyped(KeyEvent e)
{
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// g2d.drawImage(fatsprite, x-10, y-10, null);
g.setColor(Color.BLACK);
g.fillOval(x-10, y-10, 20, 20);
}
class TimeListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(whichTimer == 'W')
{
y-=1;
repaint();
}
if(whichTimer == 'A')
{
x-=1;
repaint();
}
if(whichTimer == 'S')
{
y+=1;
repaint();
}
if(whichTimer == 'D')
{
x+=1;
repaint();
}
}
}
}
确保组件是可聚焦的并且具有焦点。此外,最好使用密钥绑定,有关详细信息,请参阅如何使用密钥绑定。
@Max是正确的,KeyBindings
是解决问题的更好方法。关键问题(抱歉,并非双关语)是,一旦焦点转移到任何其他组件,您将不再收到关键事件。现在,你可能会想,"但我没有改变焦点"——你只需要点击另一个可聚焦组件就可以失去关键焦点,或者按下tab键,KeyListener
通常不会收到通知。
一般来说,正如您所发现的,KeyListeners
是不可靠的,它们不仅只会在有问题的组件有焦点时得到通知,而且密钥可以在到达之前消耗掉
1。问题是您在这里的组件是loosing focus
。
2.请检查您的组件是否为focusable
,尝试使用KeyBinding
3.此外,请记住。。。在Swings
中,焦点从从左到右、从上到下移动,其中与AWT
中一样,它根据组件添加到容器的顺序