2017-09-23 6 views
0

J'ai donc suivi un tutoriel sur YouTube qui vous apprend à écrire un petit jeu en Java. Même si j'ai exactement le même code que celui de la vidéo, j'ai un petit problème.repaint() ne fonctionne pas si j'ajoute un KeyListener

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); 

} 

Le problème est qu'il semble que repeindre() ne soit pas appelé dès que je l'ajoute KeyListener à mon cadre. Cela fonctionne si enlever le KeyListener. Je ne pense pas que le problème est ma classe KeyHandler car le problème persiste si j'utilise le KeyListener standard.

Répondre

0

Difficile de répondre à la question sans connaître le but du jeu ou l'implémentation KeyHandler particulière utilisée. Ce qui suit a fonctionné pour moi:

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); 
    } 
}