对于学校,我必须做一个基于突围的小游戏。
我得到了我的JFrame:
game.setFocusable(true);
setContentpane(game);
在我的游戏中我添加了一个扩展Keylistener并实现JPanel的输入处理程序。
setFocusable(true);
Inputhandler input = new Inputhandler();
addKeylistener(input);
它似乎不起作用,我已经编写了很多测试,但我无法看到输入句柄捕获任何keyPressed。
当我将JFrame更改为:
时add(game);
它的工作方式就像工作一样,但我这样做时遇到的问题是以正确的方式绘制我的面板。我有点坚持这个问题所以请有人帮助我。
我现在已达到目标:
public Game(){
setFocusable(true);
requestFocus();
requestFocusInWindow();
getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed");
getActionMap().put("pressed", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Space is pressed");
}
});
this.inputHandler = new InputHandler();
addKeyListener(this.inputHandler);
setPreferredSize(new Dimension(500,500));
}
答案 0 :(得分:4)
如果我每次问这个问题都有一美元,我就退休了。按照以前的类似问题......
requestFocusInWindow()
来实现的。修改强>
我已经使用了您的代码,它的工作原理,包括键绑定和KeyListener:
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
public class Game extends JPanel {
private InputHandler inputHandler;
public Game() {
setFocusable(true);
requestFocus();
requestFocusInWindow();
getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "pressed");
getActionMap().put("pressed", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Space is pressed");
}
});
this.inputHandler = new InputHandler();
addKeyListener(this.inputHandler);
setPreferredSize(new Dimension(500, 500));
}
class InputHandler extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("key pressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("key released");
}
}
private static void createAndShowGui() {
Game mainPanel = new Game();
JFrame frame = new JFrame("Game");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}