在Java Applet中监听键盘输入的最佳方法是什么?
我有一个打开JFrame的applet,我使用KeyListener来监听键盘输入.这在我的开发环境(eclipse)中运行良好,但是当我通过浏览器运行applet(我尝试过Firefox和IE)时,它不响应键盘事件.
但是,如果我运行applet然后最小化并最大化框架,它就可以工作.
我已尝试以多种不同的方式将焦点设置到JFrame,并以编程方式最小化和最大化它,但没有效果.
我也尝试过键绑定,但遇到了同样的问题.
我已将代码修剪为问题的最基本要点并将其粘贴到下面.
有人能看出我做错了什么或建议更好的解决方案吗?
public class AppletTest extends Applet
{
private GuiTest guiTest;
public void init() {
guiTest = new GuiTest();
final AppletTest at = this;
guiTest.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent ke) {
at.keyPressed(ke);
}
public void keyReleased(KeyEvent ke) {}
public void keyTyped(KeyEvent e) {}
});
}
private void keyPressed(KeyEvent ke)
{
System.out.println("keyPressed "+KeyEvent.getKeyText(ke.getKeyCode()));
getGuiTest().test(KeyEvent.getKeyText(ke.getKeyCode()));
}
}
public class GuiTest extends JFrame {
String teststring = "?";
public GuiTest()
{
setSize(100,100);
setEnabled(true);
setVisible(true);
setFocusable(true);
requestFocus();
requestFocusInWindow();
toFront();
}
public void test(String t)
{
teststring = t;
repaint();
}
public void paint(Graphics g)
{
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.black);
g.drawString(teststring, 50, 50);
}
}
解决方法:
我解决了这个问题.如果我在applet上按下按钮或鼠标事件后创建JFrame,则JFrame上的键监听器可以正常工作.显然,从Applet.init()创建框架意味着当通过浏览器打开时,键侦听器无法正常运行.
但问题仍然存在 – 为什么?如果有人能够解释这一点,我将非常感激.
我认为这可能是因为应该在事件派发线程上创建框架,但是使用SwingUtilities.invokeLater或invokeAndWait不起作用.