2017-09-23 6 views
0

그래서 저는 Java에서 작은 게임을 작성하는 방법을 가르치는 youtube 튜토리얼을 따라갔습니다. 비디오에있는 사람과 정확히 같은 코드가 있지만 약간의 문제가 있습니다.KeyListener를 추가하면 repaint()가 작동하지 않습니다.

public class Screen extends JPanel implements Runnable { 
    Thread thread = new Thread(this); 
    Frame frame; 
    int fps = 0; 
    int scene; 
    boolean running = false; 

    public Screen(Frame frame) { 
     this.setFocusable(true); 
     this.frame = frame; 
     frame.addKeyListener(new KeyHandler(this)); 
     thread.start(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.clearRect(0, 0, this.frame.getWidth(), this.frame.getHeight()); 
     if (scene == 0) { 
      g.setColor(Color.BLUE); 
     } else if (scene == 1) { 
      g.setColor(Color.GREEN); 
     } else { 
      g.setColor(Color.WHITE); 
    } 

    g.fillRect(0, 0, getWidth(), getHeight()); 
    g.setColor(Color.BLACK); 
    g.drawString(fps + "", 10, 10); 
    } 

    public void run() { 
     System.out.println("[Success] Frame Created!"); 
     long lastFrame = System.currentTimeMillis(); 
     int frames = 0; 
     running = true; 
     scene = 0; 

     while (running) { 
      repaint(); 
      frames++; 

      if (System.currentTimeMillis() - 1000 >= lastFrame) { 
       fps = frames; 
       frames = 0; 
       lastFrame = System.currentTimeMillis(); 
      } 

      try { 
       Thread.sleep(1); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 

     System.exit(0); 

} 

문제는 내 프레임에 KeyListener를 추가하자 마자 repaint()가 호출되지 않는 것 같습니다. KeyListener를 삭제하면 작동합니다. 표준 KeyListener를 사용하면 문제가 남아있는 것처럼 문제가 내 KeyHandler 클래스라고 생각하지 않습니다.

답변

0

게임의 목적이나 사용 된 특정 KeyHandler 구현을 모른 채 질문에 대답하기가 어렵습니다. 다음은 나를 위해 일했습니다 :

public class Screen extends JPanel implements Runnable { 
    Thread thread = new Thread(this); 
    Frame frame; 
    int fps = 0; 
    int scene; 
    boolean running = false; 

    public Screen(Frame frame) { 
     this.setFocusable(true); 
     this.frame = frame; 
     frame.setFocusable(true); 
     frame.addKeyListener(new KeyListener() { 

      @Override 
      public void keyTyped(KeyEvent e) {} 

      @Override 
      public void keyPressed(KeyEvent e) { 
       handleKeyChar(e.getKeyChar()); 
      } 

      @Override 
      public void keyReleased(KeyEvent e) {} 

      private void handleKeyChar(char c) { 
       switch (c) { 
       case '0': 
        scene = 0; 
        break; 
       case '1': 
        scene = 1; 
        break; 
       default: 
        scene = 2; 
       } 
      } 

     }); 
     thread.start(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.clearRect(0, 0, this.frame.getWidth(), this.frame.getHeight()); 
     if (scene == 0) { 
      g.setColor(Color.BLUE); 
     } else if (scene == 1) { 
      g.setColor(Color.GREEN); 
     } else { 
      g.setColor(Color.WHITE); 
     } 

     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.BLACK); 
     g.drawString(fps + "", 20, 40); 
    } 

    public void run() { 
     System.out.println("[Success] Frame Created!"); 
     long lastFrame = System.currentTimeMillis(); 
     int frames = 0; 
     running = true; 
     scene = 0; 

     while (running) { 
      repaint(); 
      frames++; 

      if (System.currentTimeMillis() - 1000 >= lastFrame) { 
       fps = frames; 
       frames = 0; 
       lastFrame = System.currentTimeMillis(); 
      } 

      try { 
       Thread.sleep(1); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 

     System.exit(0); 

    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Example"); 
     frame.setSize(600, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Screen panel = new Screen(frame); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 
} 
관련 문제