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) Để đượ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. –