JApplet/JPanel无法接收KeyListener事件!

3
我无法让JApplet中的JPanel接收键盘事件。我不知道原因!
请注意:
1.在输入之前单击面板(使用鼠标)没有任何影响。这是我在网络上看到的最常见的建议。
2.我尝试使用“低级”java.awt.KeyEventDispatcher接口。也没有效果!
3.但是,如果我使用Applet而不是JApplet,则Applet可以接收键盘事件。但即使在这里,一旦我向此Applet添加一个Panel(该Panel确实是所有app /绘图逻辑的地方),我就再次停止接收kb事件(在我的Panel中)!
4.现在,我不能简单地使用Applet(而不是JApplet),因为它的onPaint获取Graphics(而不是Graphics2D对象)。所以,问题3对我来说不是解决方法。
5.AppletViewer与JDK一起提供的工具效果很好。
我非常需要某人的帮助。过去2-3天里尝试了各种排列组合,现在连我都记不清了。
我的平台详细信息:
1.Firefox 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/plugin/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 Viewer、Win XP、Java 1.6.0_16版本在我的电脑上运行正常。 - Pool
嘿,尼克,正如我在上面的注释#5中所说的那样,在Applet Viewer中它对我也很好用。 - Harry
2
抱歉,我错过了。我刚在XP下的浏览器(FF3.5、IE8和Chrome 3)中进行了测试,它们都可以正常工作。看起来这个问题基本上是Fedora插件的问题。 - Pool
3个回答

3

我在网上找到了这个解决方案,它解决了我的问题:

As for the fact that KeyListener does not work for JApplet as it does for Applet you should use the KeyEventDispatcher interface.

public class AppletMain extends JApplet implements

java.awt.KeyEventDispatcher

Furthermore you have to set the KeyboardFocusManager to the Panel

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);

Afterwards override the dispatchKeyEvent function of the interface:

@Override
public boolean dispatchKeyEvent(KeyEvent e);

This allows you to catch the KeyEvents as it is done with KeyListener.


2

我调查了与我的当前项目相关的问题,并探讨了JApplet类的可聚焦性问题。
问题在于使用setFocusable(true);解决了这个问题。
你可能还需要添加聚焦捕获调用,例如requestFocusInWindow();才能正常工作。


1

我在Ubuntu 9.04和10.10中使用Firefox版本3.6.11和3.6.14时,遇到了sun-java-6包和openjdk包的问题。我发现了两个解决方法:使用Applet而不是JApplet,或者在mousePressed(..)函数中实现一个调用“requestFocus()”的MouseListener。


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