Java Applet中的键盘输入

4
什么是在Java Applet中监听键盘输入的最佳方法?
我有一个Applet,它打开一个JFrame,并使用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);
    }
}

1
出于好奇,你为什么想要直接捕获按键? - Nick ODell
我正在制作一个键盘控制的游戏。这也是我使用绘图方法而不是组件的原因。我希望还可以将其用于菜单的键盘快捷方式。 - Henrik
2个回答

1

我解决了这个问题。如果我在应用程序上的按钮按下或鼠标事件后创建JFrame,则JFrame上的键监听器将起作用。显然,从Applet.init()创建框架意味着当通过浏览器打开时,键监听器不会正确工作。

然而,问题仍然存在-为什么?如果有人能解释一下,我将非常感激。

我认为可能是因为应该在事件分派线程上创建框架,但使用SwingUtilities.invokeLater或invokeAndWait没有起作用。


0

我认为您遇到了插件焦点问题:在许多现代浏览器中,插件只能通过用户单击或使用JavaScript来获得焦点。这通常会影响Flash,但也可能影响小程序。请尝试阅读Adobe的建议http://kb2.adobe.com/cps/155/tn_15586.html

如果有用,请告诉我。


我无法让它工作。我还尝试在网上搜索其他设置焦点的JavaScript方法。我已经粘贴了我的一次尝试。我对JavaScript不熟悉,所以可能出现了错误。<html><head></head> <body onLoad="window.document.Test.focus();"> <applet id = "Test" name = "Test" code="test/AppletTest.class" archive = "test.jar"> </applet> </body> </html> - Henrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接