2009-11-02 59 views
3

我无法让我的JApplet中的JPanel接收键盘事件。我不能为什么!JApplet/JPanel没有收到KeyListener事件!

注意打字之前...

  1. 点击面板(鼠标)没有什么区别。这是我在网上看到的最常见的建议。

  2. 我已经尝试使用'低级'java.awt.KeyEventDispatcher接口。这也没有什么不同!

  3. 但是,如果我使用Applet代替JApplet,那么Applet会接收键盘事件。但即使在这里,当我为这个Applet添加一个Panel(Panel实际上是我所有的应用/绘制逻辑所在的地方)时,我再次停止接收kb事件(在我的Panel中)!

  4. 现在,我不能简单地使用Applet(而不是JApplet),因为其中的onPaint获取Graphics(而不是Graphics2D对象)。所以,#3对我来说不是一个解决方案。

  5. 事情就像JDK附带的AppletViewer中的魅力一样。

我非常需要别人的帮助。花了2-3天尝试各种各样的组合,我现在甚至都不记得。

我的平台详细信息:

  1. 火狐3.5.3

  2. 的Fedora 11在x86(与最新的更新/补丁)

  3. Java插件:尝试这两种,没有区别。

    3.1的IcedTea的Java Web浏览器插件1.6(Fedora的-29.b16.fc11-I386)

    3.2 jdk1.6.0_16/JRE /插件/ I386/NS7/libjavaplugin_oji.so

  4. 使用的在jdk1.6.0_16上面编译我的小程序源码。

这是我的代码。将非常感谢从我的同行程序员听到......因为我完全卡住了!

感谢,

/SD

import java.awt.event.*; 
import java.awt.*; 

import javax.swing.*; 
import javax.swing.event.*; 


class MyAppletKeyListener implements KeyListener, MouseListener { 

    public void keyPressed(KeyEvent e) { 
    System.out.println("panel:keyPressed" + e.getKeyChar()); 
    } 
    public void keyReleased(KeyEvent e) { 
    } 
    public void keyTyped(KeyEvent e) { 
    System.out.println("panel:keyTyped" + e.getKeyChar()); 
    } 

    public void mouseClicked(MouseEvent e) { 
    System.out.println("panel:mouseClicked"); 
    } 
    public void mouseEntered(MouseEvent e) { } 
    public void mouseExited(MouseEvent e) { } 
    public void mousePressed(MouseEvent e) { } 
    public void mouseReleased(MouseEvent e) { } 
} 


public class TestApplet extends JApplet implements MouseListener { 
    public void init() { 
    System.out.println("applet:init"); 

    MyAppletKeyListener listener = new MyAppletKeyListener(); 

    // Panel related 
    // Note: I'd like this red panel to handle 
    // all my keyboard and mouse events. 
    JPanel panel = new JPanel(); 
    panel.setLayout(new FlowLayout()); 
    panel.add(new JButton("test")); 
    panel.add(new JButton("test2")); 
    panel.setFocusable(true); 
    panel.requestFocus(); 
    panel.setBackground(new Color(200, 0, 0)); 
    panel.addKeyListener(listener); 
    panel.addMouseListener(listener); 

    // applet related 
    // Note: Added this only for debugging. I do NOT want 
    // to handle my mouse/kb events in the applet. 
    addMouseListener(this); 
    getContentPane().setLayout(new FlowLayout()); 
    getContentPane().add(panel); 

    } 

    public void mouseClicked(MouseEvent e) { 
    System.out.println("applet:mouseClicked"); 
    } 
    public void mouseEntered(MouseEvent e) { } 
    public void mouseExited(MouseEvent e) { } 
    public void mousePressed(MouseEvent e) { } 
    public void mouseReleased(MouseEvent e) { } 
} 

的HTML:

<html> 
    <head> 
    </head> 
    <body> 
    <applet id="myApplet" code="TestApplet.class" 
     width="425" 
     height="150" > 
    </applet> 
    </body> 
</html> 
+1

您的代码适用于我使用Applet查看器,Win XP,Java 1.6.0_16。 – Pool 2009-11-03 14:08:49

+0

嘿,尼克,正如我在上面的注释#5中所说的那样,它在Applet查看器中对我也很好。 – Harry 2009-11-03 15:52:49

+2

对不起,错过了。我只是在XP下用浏览器,FF3.5,IE8和Chrome 3进行了测试,它们对我来说都工作得很好。它看起来像是一个孤立的Fedora插件问题。 – Pool 2009-11-04 01:07:02

回答

3

我发现这个在网络上,它解决了这个问题对我来说:

至于KeyListener并不是 为JApplet工作,因为它为 小程序,你应该使用 KeyEventDispatcher接口。

public class AppletMain extends JApplet implements 

java.awt.KeyEventDispatcher

而且您必须将 的KeyboardFocusManager设置面板

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); 

然后覆盖 接口的 dispatchKeyEvent功能:

@Override 
public boolean dispatchKeyEvent(KeyEvent e); 

这使您可以像使用KeyListener一样捕获KeyEvents 。

1

我在使用firefox 3.6.11和3.6.14的Ubuntu 9.04和10.10中有sun-java-6软件包和openjdk软件包的问题。我发现了两种解决方法:使用Applet而不是JApplet,或者实现在mousePressed(..)函数中调用“requestFocus()”的MouseListener。

2

我调查了与当前项目相关的问题,并探讨了JApplet类的可聚焦性问题。
这是因为为什么setFocusable(true);决定了这个问题。
您最终还可能需要添加焦点捕获调用,例如requestFocusInWindow();,以使其工作正常。

+0

setFocusable(true)为我工作。谢谢! – Pikamander2 2015-04-23 20:27:40