2011-05-07 65 views
4

在Java Applet中监听键盘输入的最佳方法是什么?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); 
    } 
} 
+1

出于好奇,你为什么要直接捕获按键? – 2011-05-07 17:49:07

+0

我正在制作一款键盘控制游戏。这也是我使用paint方法而不是Components的原因。我想将它用于菜单的键盘快捷键。 – Henrik 2011-05-07 21:50:48

回答

0

我认为你正在运行到插件焦点问题:在许多现代的浏览器插件只获得焦点或者通过它用户点击或使用Javascript。这通常会影响Flash,但它可能会影响Applet。试用Adobe的建议http://kb2.adobe.com/cps/155/tn_15586.html

让我知道,如果这对你有用。

+0

我无法得到这个工作。我也试着在网上搜索其他JavaScript设置焦点的方法。我在下面粘贴了一个我的尝试。我对JavaScript没有经验,所以也许我犯了一个错误。 <体的onLoad = “window.document.Test.focus();”> <小程序ID = “测试” 名称= “测试” 代码= “测试/ AppletTest.class” 归档=“测试。罐子“> – Henrik 2011-05-07 21:39:41

1

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

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

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