2017-09-23 14 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); 
    } 
} 
関連する問題