Java KeyListener с движущимся объектом

Я пытаюсь включить Java KeyListener в свой движущийся объект со стрелками влево/вправо, влияющими на координаты оси x (xSpeed), и стрелками вверх/вниз, влияющими на ось y (ySpeed). Я просто не могу по какой-то причине подключить объект и KeyListener. Помоги мне, пожалуйста? Спасибо!

    import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class Action
{
    private static final int GRAVITY = 1;
    private int ballDegradation = 8;
    private Ellipse2D.Double circle;
    private Color color;
    private int diameter;
    private int xPosition;
    private int yPosition;
    private final int groundPosition; 
    private final int topPosition;
    private final int leftSidePosition;
    private final int rightSidePosition;
    private Canvas canvas;
    private int ySpeed = -1;  
    private int xSpeed = 8;
    public Action(int xPos, int yPos, int ballDiameter, Color ballColor,
    int groundPos, int topPos, int leftSidePos, int rightSidePos, Canvas drawingCanvas)
    {
        xPosition = xPos;
        yPosition = yPos;
        color = ballColor;
        diameter = ballDiameter;
        groundPosition = groundPos;
        topPosition = topPos;
        leftSidePosition = leftSidePos;
        rightSidePosition = rightSidePos;
        canvas = drawingCanvas;
    }
    public void draw()
    {
        canvas.setForegroundColor(color);
        canvas.fillCircle(xPosition, yPosition, diameter);
    }
    public void erase()
    {
        canvas.eraseCircle(xPosition, yPosition, diameter);
    }    
    public void move()
    {
        erase();
        ySpeed += GRAVITY;
        yPosition += ySpeed;
        xPosition += xSpeed;
        if(yPosition >= (groundPosition - diameter) && ySpeed > 0) 
        {
            yPosition = (int)(groundPosition - diameter);
            ySpeed = -ySpeed + ballDegradation; 
        }
        if(yPosition <= topPosition && ySpeed < 0)
        {
            yPosition = (int)topPosition;
            ySpeed = -ySpeed + ballDegradation;
        }
        if(xPosition <= leftSidePosition && xSpeed <0)
        {
            xPosition = (int)leftSidePosition;
            xSpeed = -xSpeed + ballDegradation;
        }
        if(xPosition >= (rightSidePosition - diameter) && xSpeed > 0) 
        {
            xPosition = (int)(rightSidePosition - diameter);
            xSpeed = -xSpeed + ballDegradation;
        }
        draw();
    }
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            switch( keyCode ) { 
        case KeyEvent.VK_UP:
            ySpeed = -ySpeed --;
            break;
        case KeyEvent.VK_DOWN:
            ySpeed = -ySpeed ++;
            break;
        case KeyEvent.VK_LEFT:
            xSpeed = xSpeed --;
            break;
        case KeyEvent.VK_RIGHT :
            xSpeed = xSpeed ++;
            break;
     }
    } 
    }

person user1421533    schedule 28.05.2012    source источник


Ответы (1)


  • не используйте зарезервированные имена Java для API, методов или e.i., Action может быть MyAction

  • не используйте AWT Canvas (только если у вас действительно важная причина, OpenXxx, CAD, CAM...), вместо этого используйте JPanel или JComponent

  • (никто не знает остальной части вашего кода) не смешивайте компонент AWT с компонентом Swing JComponent

  • в случае, если вы будете использовать JPanel или JComponent, используйте KeyBindings, а не KeyListener

  • в противном случае вам нужно установитьFocusable для Canvas, и после любых изменений в Focus вы должны снова установить Focus на Canvas, это проблемы с KeyListener

person mKorbel    schedule 28.05.2012