2013-11-04 2 views
1

화살표 키를 사용하여 자바 스윙 창에서 원을 움직이는 프로그램을 만들려고합니다. 키 바인딩이 정상적으로 작동하지만 원을 표시 할 때 항상 문제가 있습니다. 코드는 다음과 같습니다.자바 스윙 창에서 모양의 움직임을 제어 할 때의 문제

public class ShapesMove extends JFrame{ 

    public static int x = 40; 
    public static int y = 40; 

    public static void main(String[] args){ 

     final JFrame frame = new JFrame("Movement of 2d Shapes"); 
     frame.setSize(400,400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel content = (JPanel) frame.getContentPane(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     Action actionRight = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionRightEvent){ 
       x++; 
      } 
     }; 

     Action actionLeft = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionLeftEvent){ 
       x--; 
      } 
     }; 

     Action actionUp = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionUpEvent){ 
       y++; 
      } 
     }; 

     Action actionDown = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionDownEvent){ 
       y--; 
      } 
     }; 

     KeyStroke right = KeyStroke.getKeyStroke("RIGHT"); 
     KeyStroke left = KeyStroke.getKeyStroke("LEFT"); 
     KeyStroke up = KeyStroke.getKeyStroke("UP"); 
     KeyStroke down = KeyStroke.getKeyStroke("DOWN"); 

     InputMap inputMap = content.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     inputMap.put(right, "RIGHT"); 
     inputMap.put(left, "LEFT"); 
     inputMap.put(up, "UP"); 
     inputMap.put(down, "DOWN"); 
     content.getActionMap().put("RIGHT", actionRight); 
     content.getActionMap().put("LEFT", actionLeft); 
     content.getActionMap().put("UP", actionUp); 
     content.getActionMap().put("DOWN", actionDown); 

    } 
    public void draw(Graphics g){ 
     g.drawOval(x, y, 60, 60); 
    } 
} 

모든 올바른 모듈이 있기 때문에 가져 오기 라인이 포함되지 않았습니다. 컴파일은 항상 정상적으로 진행되지만 실행하면 원이 표시되지 않습니다. 나는 그 자신의 분리 된 거짓말과 그 원이 내가 그것을 만났을 때 나타나는 위로 향하는 표시에 대해 같은 코드를 시험해 보았다. 그래서 나는 무엇을 여기에서 잘못하고 있냐?

+1

무승부 란? – Dodd10x

답변

1

코드가 변경되었으므로 정상적으로 작동합니다. paintComponent 메서드를 재정의하고 draw 메서드를 호출하십시오. JFrameJPanel으로 변경하십시오.

public class ShapesMove extends JPanel{ 

    public static int x = 40; 
    public static int y = 40; 

    public static void main(String[] args){ 

     final JFrame frame = new JFrame("Movement of 2d Shapes"); 
     frame.setSize(400,400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final ShapesMove m = new ShapesMove(); 
     frame.getContentPane().add(m); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     Action actionRight = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionRightEvent){ 
       x++; 
       m.repaint(); 
      } 
     }; 

     Action actionLeft = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionLeftEvent){ 
       x--; 
       m.repaint(); 
      } 
     }; 

     Action actionUp = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionUpEvent){ 
       y++; 
       m.repaint(); 
      } 
     }; 

     Action actionDown = new AbstractAction(){ 
      public void actionPerformed(ActionEvent actionDownEvent){ 
       y--; 
       m.repaint(); 
      } 
     }; 

     KeyStroke right = KeyStroke.getKeyStroke("RIGHT"); 
     KeyStroke left = KeyStroke.getKeyStroke("LEFT"); 
     KeyStroke up = KeyStroke.getKeyStroke("UP"); 
     KeyStroke down = KeyStroke.getKeyStroke("DOWN"); 

     InputMap inputMap = m.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     inputMap.put(right, "RIGHT"); 
     inputMap.put(left, "LEFT"); 
     inputMap.put(up, "UP"); 
     inputMap.put(down, "DOWN"); 
     m.getActionMap().put("RIGHT", actionRight); 
     m.getActionMap().put("LEFT", actionLeft); 
     m.getActionMap().put("UP", actionUp); 
     m.getActionMap().put("DOWN", actionDown); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawOval(x, y, 60, 60); 
    } 

    } 
+0

감사합니다. 편집하기 전에 게시 한 파일이 실제로 조금 더 효과적 이었지만 불쾌감은 없었습니다. 내 paintComponent 메서드에 대한 재정의가 편집 후에 잘못된 위치에 있었기 때문에 오류가 계속 발생했습니다. – dakatk

2

drawling을 수행하려면 paintComponent을 무시해야합니다. JFrame은 contentPane이있는 컨테이너이기 때문에 프레임 자체가 아닌 JFrame에 추가하는 구성 요소에서이 작업을 수행하면 추가 수정을 위해 상황을 더 복잡하고 덜 유연하게 만듭니다.