2017-09-23 41 views
0

因此,我遵循了一個YouTube教程,教你如何用Java編寫一個小遊戲。儘管我和視頻中的人有完全一樣的代碼,但我遇到了一些問題。如果我添加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添加到我的框架後,似乎重新調用()不會被調用。如果刪除KeyListener,它將起作用。我不認爲問題是我的KeyHandler類,因爲如果我使用標準的KeyListener,問題依然存在。

回答

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