keyPressed事件不一致:有时会触发,有时不会触发,重新启动程序而不更改任何内容,它可能会或现在可以正常工作

Hel*_*ant 4 java swing focus keypress keylistener

好的,所以我在这里非常沮丧.这段代码只是一个非常简单的移动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();
        }
    }

}
}
Run Code Online (Sandbox Code Playgroud)

ten*_*ica 5

确保组件可对焦且具有焦点.此外,最好使用键绑定,有关详细信息,请参阅如何使用键绑定.