gpt4 book ai didi

java - addKeyListener() 不适用于 JPanel

转载 作者:太空狗 更新时间:2023-10-29 22:42:34 31 4
gpt4 key购买 nike

我正在尝试制作游戏引擎。我制作了 Game 类,但错误出在 KeyBoard 类中。这里我留下一些代码。

类::游戏

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

}

类::键盘

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

}

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

}

但是错误是没有抛出异常并且没有读取输入。谁能告诉我这样做的正确方法..

最佳答案

简单地说,您的面板需要可聚焦。在创建面板的任何地方添加:

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

这是一个 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);

}
}

此外,https://www.google.com/search?q=jpanel+keylistener

关于java - addKeyListener() 不适用于 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8498147/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com