2013-03-29 3 views
0

나는 탁구 프로그램을 만들고 있으며, 모든 것을 그려 내기 시작하는 시작 버튼이 있습니다. 말 그대로 공을 굴릴 수 있습니다 (말장난을 환영합니다). 어쨌든 시작 버튼을 누르면 캔버스의 마우스를 클릭하여 우선 순위를 지정하지 않으면 패들의 이동을위한 키 리스너가 작동하지 않습니다. 어떤 종류의 코드가 자동으로 캔버스에 사용자가 그렇게하기 위해 번거 로움없이 캔버스에 있습니까? 미리 감사드립니다.캔버스에서 클릭

이것은 awt를 실행 중입니다. 나는 스윙을 배워야한다는 것을 알았지 만 결코 그것에 대해 알지 못했다.

public class Pong extends Applet implements ActionListener, KeyListener 
{ 
    Canvas c1; 
    Graphics myG; 
    Button start; 

    ball ball; 
    paddle LPaddle; 
    paddle RPaddle; 

    public void init() 
    { 
     this.setSize(1300,700); 

     c1 = new Canvas(); 
     add(c1); 
     c1.addKeyListener(this); 
     c1.setBackground(Color.pink); 

     start = new Button("Start"); 
     add(start); 
     start.addActionListener(this); 


     ball = new ball(); 

     LPaddle = new paddle(); 
     RPaddle = new paddle(); 

     myG = c1.getGraphics(); 


    } 

    public void paint(Graphics g) 
    { 
     c1.setLocation(0,0); 
     c1.setSize(1251,700); 

     start.setLocation(1255,350); 
     start.setSize(40,20); 
    } 


    public void keyPressed(KeyEvent e) 
    { 
     if(e.getKeyCode()==KeyEvent.VK_UP)//up 
     { 
      RPaddle.erasePaddle(myG); 
      RPaddle.movePaddleUp(); 
      RPaddle.drawPaddle(myG); 
     } 
     if(e.getKeyCode()==KeyEvent.VK_DOWN)//down 
     { 
      RPaddle.erasePaddle(myG); 
      RPaddle.movePaddleDown(); 
      RPaddle.drawPaddle(myG); 
     } 
     if(e.getKeyCode()==KeyEvent.VK_W) 
     { 
      LPaddle.erasePaddle(myG); 
      LPaddle.movePaddleUp(); 
      LPaddle.drawPaddle(myG); 
     } 
     if(e.getKeyCode()==KeyEvent.VK_S) 
     { 
      LPaddle.erasePaddle(myG); 
      LPaddle.movePaddleDown(); 
      LPaddle.drawPaddle(myG); 
     } 
     if(e.getKeyCode()==KeyEvent.VK_ENTER) 
     { 
      myG.drawLine(625,0,625,700); 
      LPaddle.setInitial(150,0,350); 
      RPaddle.setInitial(150,1250,350); 

      LPaddle.drawPaddle(myG); 
      RPaddle.drawPaddle(myG); 
     } 
    } 

    public void keyReleased(KeyEvent e) 
    { 

    } 

    public void keyTyped(KeyEvent e) 
    { 

    } 



    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource()==start) 
     { 
      myG.drawLine(625,0,625,700); 
      LPaddle.setInitial(150,0,350); 
      RPaddle.setInitial(150,1250,350); 

      LPaddle.drawPaddle(myG); 
      RPaddle.drawPaddle(myG); 
     } 
    } 
+0

문제를 설명하기 위해 최소한의 코드를 게시하십시오. –

+0

AWT를 사용해야합니까, 아니면 Swing을 사용할 수 있습니까? – MadProgrammer

답변

1

KeyListeners 다시 중요한, 중요한 무승부가 낮은 수준의 인터페이스입니다 : 그들이에 등록 된 componet는 포커스해야하며 초점.

시작 버튼을 클릭하면 버튼이 집중됩니다.

캔버스의 인스턴스에서 requestFocusInWindow을 호출 할 수 있지만 캔버스가 처음부터 포커스를받을 수 있다고 가정합니다.

가능한 경우 JComponent/JPanel을 게임 캔버스의 기본으로 사용하고 key bindings API를 사용하는 것이 좋습니다.