在Java Applet中侦听键盘输入的最佳方式是什么?
我有一个打开JFrame的小程序,我正在使用一个KeyListener来监听键盘输入。这在我的开发环境(eclipse)中工作得很好,但是当我通过浏览器(我已经尝试过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);
}
}发布于 2011-05-13 04:13:46
我解决了这个问题。如果我在小程序上按下按钮或鼠标事件后创建JFrame,则JFrame上的按键侦听器可以工作。显然,从Applet.init()创建框架意味着在通过浏览器打开密钥侦听器时不能正常工作。
然而,问题仍然存在-为什么?如果有人能解释这一点,我将不胜感激。
我认为这可能是因为框架应该在事件分派线程上创建,但使用SwingUtilities.invokeLater或invokeAndWait不起作用。
发布于 2011-05-08 02:53:57
我认为你遇到了插件焦点问题:在许多现代浏览器中,插件只有通过用户点击或使用Javascript才能获得焦点。这通常会影响Flash,但也可能会影响applet。在http://kb2.adobe.com/cps/155/tn_15586.html上试试奥多比的推荐吧。
如果这对你有效,请让我知道。
https://stackoverflow.com/questions/5922849
复制相似问题