Java 无键盘输入工作键适配器
我写了一些应用程序,想给它添加一些键盘输入。 我的主类扩展了一个JPanel,因此我可以将keyAdapter添加到构造函数中。 keyAdapter是一个名为“InputAdapter”的新类,它使用keyPressed()和KeyRelease()方法扩展keyAdapter。单击或释放时,控制台应打印一些字符串,例如此处的“测试” 我不知道为什么,但控制台不会打印任何文本。此外,当我告诉它将精灵可见性设置为false时,也不会发生任何事情 所以我猜KeyAdapter不能正常工作,所以有人能仔细看看我的代码行吗 我想这个问题与我编写的其他实现类没有任何关系,因为当删除它们时,非工作键盘输入的问题仍然存在 包com.ochs.gameJava 无键盘输入工作键适配器,java,swing,input,keyboard,thread-sleep,Java,Swing,Input,Keyboard,Thread Sleep,我写了一些应用程序,想给它添加一些键盘输入。 我的主类扩展了一个JPanel,因此我可以将keyAdapter添加到构造函数中。 keyAdapter是一个名为“InputAdapter”的新类,它使用keyPressed()和KeyRelease()方法扩展keyAdapter。单击或释放时,控制台应打印一些字符串,例如此处的“测试” 我不知道为什么,但控制台不会打印任何文本。此外,当我告诉它将精灵可见性设置为false时,也不会发生任何事情 所以我猜KeyAdapter不能正常工作,所以有人
public class Game extends JPanel implements Runnable{
private static final long serialVersionUID = 1L;
public static final int WIDTH = 320;
public static final int HEIGHT = 240;
public static final int SCALE = 3;
public boolean isRunning;
public Game() {
addKeyListener(new InputAdapter());
setFocusable(true);
requestFocus();
start();
}
public void start() {
isRunning = true;
new Thread(this).start();
}
public void stop() {
isRunning = false;
}
public void run() {
init();
while(isRunning) {
update();
repaint();
try {
Thread.sleep(5);
} catch (InterruptedException e) {
System.out.println("Thread sleep failed.");
}
}
}
public void init() {
}
public void update() {
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
}
public static void main(String[] args) {
Game gameComponent = new Game();
Dimension size = new Dimension(WIDTH*SCALE, HEIGHT*SCALE);
JFrame frame = new JFrame("Invaders");
frame.setVisible(true);
frame.setSize(size);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(gameComponent);
}
public class InputAdapter extends KeyAdapter {
@Override
public void keyPressed(KeyEvent arg0) {
System.out.println("Test");
}
@Override
public void keyReleased(KeyEvent arg0) {
System.out.println("Test");
}
}
}
您的代码适用于我:
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.2)
OpenJDK Client VM (build 20.0-b12, mixed mode, sharing)
技巧1-我想您应该覆盖paintComponent(图形g),而不是paint()
技巧2-在JPanel上使用addNotify():
public void addNotify(){
super.addNotify();
//start from here
new Thread(this).start();
}
提示3-通过EDT线程以这种方式启动应用程序(请参阅)
希望有帮助 您的代码适合我:
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.2)
OpenJDK Client VM (build 20.0-b12, mixed mode, sharing)
技巧1-我想您应该覆盖paintComponent(图形g),而不是paint()
技巧2-在JPanel上使用addNotify():
public void addNotify(){
super.addNotify();
//start from here
new Thread(this).start();
}
提示3-通过EDT线程以这种方式启动应用程序(请参阅)
希望有帮助 这可能不起作用的原因有很多
KeyListener
非常挑剔。它要求注册的组件不仅具有焦点,而且具有焦点
即使您的组件似乎同时具有这两种功能,但由于某种原因,如果焦点被另一个组件抓住,则keysister
将停止工作
您应该使用并且requestFocus
是不可靠的,但是更好的解决方案是使用,它能够克服focus带来的混乱
您应该避免覆盖paint
,而是使用paintComponent
,查看更多详细信息
将线程与Swing混合是很棘手的,您还需要确保在更新状态时没有违反Swing的单线程规则。查看了解更多详细信息这可能不起作用的原因有很多
KeyListener
非常挑剔。它要求注册的组件不仅具有焦点,而且具有焦点
即使您的组件似乎同时具有这两种功能,但由于某种原因,如果焦点被另一个组件抓住,则keysister
将停止工作
您应该使用并且requestFocus
是不可靠的,但是更好的解决方案是使用,它能够克服focus带来的混乱
您应该避免覆盖paint
,而是使用paintComponent
,查看更多详细信息
将线程与Swing混合是很棘手的,您还需要确保在更新状态时没有违反Swing的单线程规则。查看更多详细信息您的基本代码设计是旧的AWT绘制代码。我附和程序员为更好的秋千设计所说的一切 此外:
JFrame frame = new JFrame("Invaders");
frame.add(gameComponent);
...
frame.setVisible(true);
不要采取简单的方法,只需做出上述改变。为Swing程序而不是AWT程序编写代码。您的基本代码设计是旧的AWT绘制代码。我附和程序员为更好的秋千设计所说的一切 此外:
JFrame frame = new JFrame("Invaders");
frame.add(gameComponent);
...
frame.setVisible(true);
不要采取简单的方法,只需做出上述改变。为Swing程序而不是AWT程序编写代码