さて、私はここでかなりイライラしています。このコードは、非常に単純な移動 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();
}
}
}
}