我在项目中使用默认的Java KeyListener遇到麻烦。我注意到有时启动时,KeyListener似乎并没有转发KeyEvent。
问题的症状:
启动应用程序时,未处理密钥输入。这仅在有时发生。有时,我必须关闭并启动应用程序7至8次,直到显示出来。有时这是第一次尝试。发生这种情况后,直到我再次重新启动应用程序,它才起作用。
我正在使用: Window 7 x64和最新的Eclipse和JDK版本。
我已经发现的内容:
我已经在调试模式下设置了一个断点,并检查了JPanel实例。似乎总是将KeyListener成功地添加到它。而且,MouseListener和MouseMotionListener一直都可以正常工作。
最小代码:
public class Player implements KeyListener
{
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){ }
public void keyPressed(KeyEvent e){
System.out.println("Key Pressed!");
}
}
public class Game {
public static void main(String[] args) {
new Game();
}
public Game(){
JFrame window = new JFrame();
window.setVisible(true);
//Now set the window size correctly
window.setSize(800, 600);
//Set-up the rest of the window
window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
window.setResizable(true);
//Create our panel
JPanel canvas = new JPanel();
canvas.setFocusable(true);
window.add( canvas ); //Add it to our window
Player k = new Player();
canvas.addKeyListener(k);
}
}
感谢您的时间!
PS:好的,回答我自己的问题:
似乎我必须 在 设置窗口大小 后 调用setVisible(true):
JFrame window = new JFrame();
Now set the window size correctly
window.setSize(800, 600);
window.setVisible(true);
像这样切换setSize()和setVisible()似乎可以使其工作。尝试了十几遍,没有问题。
我猜如果setVisible的大小为0x0,可能不喜欢将Focus赋予窗口。问题是:为什么这只会在某些情况下导致问题?
尝试将JButton添加到“画布” JPanel中,然后按按钮并查看KeyListener发生了什么-
失败是因为JPanel失去了焦点。为了防止这种情况的发生,请改用“键绑定”(请参阅上面我的评论中的链接以获取本教程)。例如
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class Game2 {
private static final String UP = "up";
public static void main(String[] args) {
new Game2();
}
public Game2() {
JFrame window = new JFrame("Press up-arrow key");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel canvas = new JPanel();
canvas.setPreferredSize(new Dimension(400, 300));
window.add(canvas);
canvas.add(new JButton(new AbstractAction("Press space-bar") {
public void actionPerformed(ActionEvent e) {
System.out.println("Button or space-bar pressed");
}
}));
ActionMap actionMap = canvas.getActionMap();
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = canvas.getInputMap(condition);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), UP);
actionMap.put(UP, new UpAction());
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}
@SuppressWarnings("serial")
class UpAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Up Arrow pressed!");
}
}
问题内容: 我有一个使用从扩展的类的子类 我将一个对象添加到框架-中。现在,当我按下任意键盘键时,不会调用任何方法,并且似乎没有窗口焦点。我也尝试过调用,但仍然没有响应。 如何使它响应按键? 问题答案: 您是否为面板设置了面板本身?另外,您可能需要将面板设置为可聚焦。我通过此代码对其进行了测试,它似乎可以正常工作
问题内容: 我正在尝试为我的实现。在构造函数上,我使用以下代码: 当我运行它时,该消息出现在我的控制台中。但是,当我按一个键时,我没有收到其他任何消息,好像该消息根本不在那儿。 我当时想这可能是因为重点不在上 ,所以他们没有收到任何事件。但是,我很确定。 我有什么想念的吗? 问题答案: 你必须将keyListener添加到所需的每个组件中。仅具有焦点的组件将发送这些事件。例如,如果JFrame中只
有人能告诉我为什么这也不管用吗?(我的第二个动作监听器是我的游戏所需的其他东西)
问题内容: 我正在做一个涉及JPanel中的鼠标和键监听器的小项目。不幸的是,当我使用鼠标/键盘时,没有一个方法被调用。我之前曾使用过JPanels / JFrame / JApplet和JComponents。代码片段如下所示: 偏离主题:我不断收到错误消息您的帖子似乎包含格式错误的代码。请使用代码工具栏按钮或CTRL + K键盘快捷键将所有代码缩进4个空格。要获得更多编辑帮助,请单击[?]工具
额外信息:我是用BlueJ来从中,用4个类在basic程序中回答我的问题。我意识到很多人在互联网上说要使用键绑定而不是KeyListener,但我现在不明白键绑定... ---遵循装满鳗鱼的气垫船的建议,我将尝试使用键绑定。--- 所以Keybindings有两个“命令”来工作:输入和操作。