2014-05-08 2 views
0

임이 자동차 프로젝트에서 거의 끝내지 만 임무는 작동하지 않는 주요 이벤트를 얻는 것 같습니다. 내 타이머로 내 청취자와 관련이 있다고는하지만 확실하지는 않습니다. 위쪽 화살표 키를 누르면 타이머 지연이 줄어들고 아래쪽 화살표 키는 그 반대가됩니다. 나는 명령을 쓰지 만 그들은 입력을 등록하지 않습니다. 사람이 좀 포인터를 줄 수 있다면 나는 그것이Java 키 이벤트 및 타이머 컨트롤

코드 감사하겠습니다 : 당신이 당신의 구성 요소와 KeyListener 등록 결코 모든

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class RaceCar extends JFrame{ 


    public RaceCar(){ 
     add(new CarPic()); 
    } 

    public static void main(String[] args){ 

     JFrame frame = new RaceCar(); 
     frame.setTitle("Brady Kedge: Race Car"); 
     frame.setSize(300, 150); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 



    public class CarPic extends JPanel implements KeyListener 
    { 
     private int x = 0; 
     private int y = 150; 
     private int z = 300; 

     Timer mytimer = new Timer(50, new ActionListener()); 



     public CarPic() 
     { 
      mytimer.start(); 


     } 



     public void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 

      y = getHeight(); 
      z = getWidth(); 

      g.setColor(Color.WHITE); 

      g.fillRect(0, 0, z, y); 

      Polygon polygon = new Polygon(); 
      polygon.addPoint(x + 10, y - 20); 
      polygon.addPoint(x + 20, y - 30); 
      polygon.addPoint(x + 30, y - 30); 
      polygon.addPoint(x + 40, y - 20); 

      if(x < z - 40) 
      { 
       g.setColor(Color.BLACK); 
       g.fillOval(x + 10, y - 10, 10, 10); 
       g.fillOval(x + 30, y - 10, 10, 10); 
       g.setColor(Color.BLUE); 
       g.fillRect(x, y - 20, 50, 10); 
       g.setColor(Color.BLUE); 
       g.fillPolygon(polygon); 

      } 

      else 
       x = 0; 
      } 



     public void actionPerformed(ActionEvent e){ 
      x+=10; 
      repaint(); 
     } 

     @Override 
     public void keyTyped(KeyEvent k) { 
      //Fill 

     } 

     @Override 
     public void keyPressed(KeyEvent k) { 
      int delay = mytimer.getDelay(); 
      if(k.getKeyCode() == KeyEvent.VK_UP) 
       mytimer.setDelay(delay > 10 ? delay - 10 : 0); 
      else if(k.getKeyCode() == KeyEvent.VK_DOWN) 
       mytimer.setDelay(delay < 5000 ? delay + 10 : 5000); 

     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

    } 
} 

답변

1

먼저 (KeyListener를 구현하는 것만으로는 충분하지 않습니다).

둘째로, KeyListener은 등록 된 구성 요소에 포커스가 있고 포커스를받을 수있는 경우에만 KeyEvents을 발생시킵니다.

더 좋은 해결책은 구성 요소가 주요 이벤트를 트리거하는 포커스 레벨을 구성하는 방법을 제공하는 key bindings API을 사용하는 것입니다.

또한 개인적으로 Timer 지연을 수정하는 대신 원하는 속도의 백분율이 될 속도 수정 자 (유형이 double)를 사용해야합니다. 이런 식으로 1은 정상 속도, 0.5 절반 속도 및 2 두 배 속도입니다.

+0

흠. 키 바인딩을 읽은 후에 구현하기가 더 쉬운 것처럼 보이지만 우리 책에서 결코 언급하지 않았기 때문에 결코 알지 못했습니다. – bkedge

+0

예, Java 1.4/5 어딘가에 소개되었으므로 글꼴은 오래된 책에서 많이 다루어집니다. – MadProgrammer