4

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

}
}
4

3 に答える 3

3

1.問題は、loosing focusここでコンポーネントを超えていることです。

2.focusableコンポーネントがであることを確認してください。KeyBinding

3.さらに、これを覚えておいてください... ではSwings、フォーカスは左から右へ、上から下へ移動AWTます。

于 2012-08-04T04:44:03.943 に答える
3

@Maxは正しいKeyBindingsです。問題に対するより良いアプローチです。重要な問題 (申し訳ありませんが、しゃれは意図されていません) は、フォーカスが他のコンポーネントに移動すると、キー イベントを受信できなくなることです。ここで、おそらく「フォーカスを変更していない」と考えているでしょう。別のフォーカス可能なコンポーネントをクリックしてキー フォーカスを失うか、KeyListener通常は通知されないタブを押すだけです。

一般的に、あなたが見つけたように、KeyListeners信頼性が低く、問題のコンポーネントがフォーカスされている間だけ通知を受け取るだけでなく、キーが到達する前に消費される可能性があります

于 2012-08-04T04:22:31.013 に答える