2011-12-14 25 views
13

Tôi đang cố gắng tạo một công cụ trò chơi. Tôi đã tạo lớp Game nhưng lỗi nằm trong lớp KeyBoard. Ở đây tôi để lại một số mã.addKeyListener() không hoạt động cho JPanel

Class :: game

package transfer2pc.co.cc.game.tileengine; 

import java.awt.Graphics; 
import java.util.HashMap; 

import javax.swing.JPanel; 

import transfer2pc.co.cc.game.tileengine.input.KeyBoard; 

public abstract class Game extends JPanel implements Runnable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 640206679500196209L; 

    HashMap<String, ?> maps = null; 

    KeyBoard keyBoard = null; 

    public Game(){ 
     super(); 
     keyBoard = new KeyBoard(this); 
     setKeyBoard(keyBoard); 
     Thread th = new Thread(this); 
     th.start(); 
    } 

    public void run(){ 
     while(true){ 
      repaint(); 
      try { 
       Thread.sleep(30); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void paint(Graphics g){ 

    } 

    public void addMap(){ 

    } 

    public void setMap(){ 

    } 

    public abstract void keyPressed(int code); 

    public abstract void keyReleased(int code); 

    public abstract void keyTyped(int code); 

    public void setKeyBoard(KeyBoard key){ 
     addKeyListener(key); 
    } 

} 

Class :: KeyBoard

package transfer2pc.co.cc.game.tileengine.input; 

import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import transfer2pc.co.cc.game.tileengine.Game; 

public class KeyBoard extends KeyAdapter implements KeyListener { 

    Game game = null; 

    public KeyBoard(Game gm){ 
     this.game = gm; 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     System.out.println("KeyPressed"); 
     game.keyPressed(e.getKeyCode()); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     game.keyReleased(e.getKeyCode()); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     game.keyTyped(e.getKeyCode()); 
    } 

    public static char getChar(int key){ 
     return (char)key; 
    } 

} 

Class :: KeyTest

package transfer2pc.co.cc.game.tileengine.test; 

import java.awt.Graphics; 

import javax.swing.JFrame; 

import transfer2pc.co.cc.game.tileengine.Game; 
import transfer2pc.co.cc.game.tileengine.input.KeyBoard; 

public class KeyTest extends Game { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8557676950779023327L; 

    char pressed; 

    public KeyTest(){ 
     super(); 
     addKeyListener(new KeyBoard(this)); 
    } 

    @Override 
    public void keyPressed(int code) { 
     pressed = KeyBoard.getChar(code); 
    } 


    @Override 
    public void keyReleased(int code) { 

    } 


    @Override 
    public void keyTyped(int code) { 

    } 

    @Override 
    public void paint(Graphics g){ 
     g.drawString("You pressed: "+pressed, 20, 20); 
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame("KeyTest"); 
     frame.setSize(640, 480); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.add(new KeyTest()); 
     frame.setVisible(true); 
    } 

} 

Nhưng lỗi là không có ngoại lệ ném và isn đầu vào không được đọc. Ai đó có thể nói cho tôi cách chính xác để làm điều này ..

+1

1) Để được trợ giúp tốt hơn sớm hơn, hãy đăng [SSCCE] (http://sscce.org/). 2) Một thành phần cần phải được tập trung trước khi nó có thể lắng nghe các sự kiện quan trọng. 3) Nếu bảng điều khiển chứa những thứ như cây hoặc bảng, các thành phần đó sẽ tiêu thụ các sự kiện chính. 4) Nó thường được khuyến khích sử dụng các ràng buộc chính trên một 'KeyListener'. 5) 'Thread.sleep (30);' Đừng làm vậy. Tôi phải thảo luận điều này 3 lần trong 2 ngày qua. Tìm kiếm bài đăng và nhận xét của tôi về lý do. –

Trả lời

38

Đơn giản, bảng điều khiển của bạn cần phải được tập trung. Thêm vào bất cứ nơi nào bạn tạo các bảng điều khiển:

panel.setFocusable(true); 
panel.requestFocusInWindow(); 

Dưới đây là một (câu hỏi Tôi đề nghị hỏi với một trong những trong tương lai) SSCCE:

import java.awt.Dimension; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class SimpleKeyTest { 

    public static void main(String[] args) { 

     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       JPanel panel = new JPanel(); 

       frame.getContentPane().add(panel); 

       panel.addKeyListener(new KeyListener() { 

        @Override 
        public void keyTyped(KeyEvent e) {} 

        @Override 
        public void keyReleased(KeyEvent e) {} 

        @Override 
        public void keyPressed(KeyEvent e) { 
         System.out.println("Pressed " + e.getKeyChar()); 
        } 
       }); 

       panel.setFocusable(true); 
       panel.requestFocusInWindow(); 

       frame.setSize(new Dimension(300, 300)); 
       frame.setVisible(true); 
      } 

     }; 

     SwingUtilities.invokeLater(r); 

    } 
} 

Ngoài ra, https://www.google.com/search?q=jpanel+keylistener

+1

* "bạn có thể nói cái gì là một sscce" * Tôi có thể, nhưng tôi đã nói nó rất nhiều lần mà cuối cùng tôi đặt nó lên trên một trang web. Cùng một trang web được liên kết * hai lần * đã có trong chuỗi này. Theo liên kết đến tài liệu. Đọc tất cả. Hỏi xem có gì không rõ ràng không. –

2

Bạn có thể thêm người nghe chính cho JFrame, đó là điều tôi đã làm trong quá khứ. Nó có lẽ không phải là một ý tưởng tốt tuy nhiên nếu bạn có các thành phần khác trong JFrame.

+1

Tôi không có bất kỳ thành phần nào trong khung nhưng jpanels phù hợp với tôi vì chúng có thể được sử dụng trong các applet. –

+1

Tôi tin rằng bạn cũng có thể thêm nó vào Applet/JApplet, nhưng tôi hiểu tại sao bạn muốn giữ mã trong JPanel – MadcoreTom

Các vấn đề liên quan