2013-03-30 1 views
1

사용자의 키 입력에 따라 사각형을 위쪽, 아래쪽, 왼쪽 및 오른쪽으로 이동하려고합니다. 내 KeyHandler 잘 작동하고 도형을 위로 또는 아래로 이동하지만 X 축 (왼쪽 또는 오른쪽)에 따라 이동하지 않습니다.사각형이 움직이지 않습니다. X Java 좌표입니다.

다음은 KeyHandler (KeyPressed) 코드입니다.

public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 

    if(keyCode == KeyEvent.VK_UP){ 
     System.out.println("You have pressed: " +keyCode); 
     _screen.player[0].y -= 3; 
     _screen.repaint(); 

    }else if(keyCode == KeyEvent.VK_DOWN){ 
     System.out.println("You have pressed: " +keyCode); 
     _screen.player[0].y += 3; 
     _screen.repaint(); 

    }else if(keyCode == KeyEvent.VK_LEFT){ 
     System.out.println("You have pressed: " +keyCode); 
     _screen.player[0].x -= 3; 
     _screen.repaint(); 

    }else if(keyCode == KeyEvent.VK_RIGHT){ 
     System.out.println("You have pressed: " +keyCode); 
     _screen.player[0].x += 3; 
     _screen.repaint(); 

    }else if(keyCode == KeyEvent.VK_ESCAPE){ 
     System.exit(0); 

    } 

} 

X 축에 직사각형을 옮기려면 뭔가 다른 점이 있습니까?

+2

당신은 문제의보다 완전한 예를 게시 할 수 있습니까? –

답변

2

게시 된 코드에 명백한 오류가 없습니다. 이 문제는 코드 부분에 표시되지 않을 수 있습니다. 실행 가능한 예제 (예 : SSCCE)를 게시하는 것이 좋습니다.

키 수신기를 사용하는 경우 구성 요소에 포커스가 있고 포커스가 있는지 확인하십시오. 그러나 하위 수준 인터페이스이므로 키 수신기를 사용하지 않는 것이 좋습니다. 키 바인딩을 대신 사용하는 것이 좋습니다. 자세한 내용 및 예는 How to Use Key Bindings을 참조하십시오. 또한 스윙 actions을 살펴보십시오.

다음은 패널 주위에 사각형을 이동하는 키 바인딩과 행동을 보여주는 간단한 예는 다음과 같습니다

public class MoveRectangle extends JPanel { 

    private Point rectPosition = new Point(); 
    public static final int RECT_SIZE = 50; 

    public Point getRectPosition() { 
     return rectPosition; 
    } 

    public void setRectPosition(Point position) { 
     this.rectPosition = position; 
     repaint(); 
    } 

    public MoveRectangle() { 
     InputMap inputMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actionMap = getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "up"); 
     actionMap.put("up", new MoveAction(this, MoveAction.Direction.UP)); 
     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "down"); 
     actionMap.put("down", new MoveAction(this, MoveAction.Direction.DOWN)); 
     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "left"); 
     actionMap.put("left", new MoveAction(this, MoveAction.Direction.LEFT)); 
     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "right"); 
     actionMap.put("right", new MoveAction(this, MoveAction.Direction.RIGHT)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawRect(rectPosition.x, rectPosition.y, RECT_SIZE, RECT_SIZE); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(200, 200); 
    } 

    static class MoveAction extends AbstractAction { 
     public enum Direction{ 
      LEFT, RIGHT, UP, DOWN 
     }; 

     private Direction direction; 
     private MoveRectangle panel; 

     public MoveAction(MoveRectangle panel, Direction direction) { 
      this.direction = direction; 
      this.panel = panel; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      Point position = panel.getRectPosition(); 
      switch(direction) { 
      case LEFT: 
       position.x -= 3; 
       break; 
      case RIGHT: 
       position.x += 3; 
       break; 
      case UP: 
       position.y -= 3; 
       break; 
      case DOWN: 
       position.y += 3; 
       break; 
      } 

      panel.setRectPosition(position); 
     } 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Move Rectangle"); 
     frame.getContentPane().add(new MoveRectangle()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
관련 문제