【问题标题】:Keyboard input in Java AppletJava Applet 中的键盘输入
【发布时间】:2011-08-20 20:08:58
【问题描述】:

在 Java Applet 中侦听键盘输入的最佳方式是什么?

我有一个可以打开 JFrame 的小程序,并且我正在使用 KeyListener 来监听键盘输入。这在我的开发环境(eclipse)中运行良好,但是当我通过浏览器运行小程序时(我尝试过 Firefox 和 IE),它不会响应键盘事件。 但是,如果我运行小程序,然后最小化和最大化框架,它就可以工作。 我尝试以多种不同的方式将焦点设置到 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);
    }
}

【问题讨论】:

  • 出于好奇,为什么要直接捕获击键?
  • 我正在制作一个键盘控制的游戏。这也是我使用paint方法而不是Components的原因。我也想将它用于菜单的键盘快捷键。

标签: java keyboard applet jframe keyboard-events


【解决方案1】:

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

但是,问题仍然存在 - 为什么?如果有人能解释一下,我将不胜感激。

我认为这可能是因为应该在事件调度线程上创建框架,但是使用 SwingUtilities.invokeLater 或 invokeAndWait 不起作用。

【讨论】:

    【解决方案2】:

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

    让我知道这是否适合你。

    【讨论】:

    • 我无法让它工作。我还尝试在网上搜索其他 JavaScript 设置焦点的方法。我在下面粘贴了我的一项尝试。我对 JavaScript 没有经验,所以也许我犯了一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2019-01-03
    相关资源
    最近更新 更多