3

我无法让我的 JApplet 中的 JPanel 接收键盘事件。我不明白为什么!

注意...

  1. 在键入之前单击面板(用鼠标)没有区别。这是迄今为止我在网上看到的最常见的建议。

  2. 我尝试使用“低级”java.awt.KeyEventDispatcher 接口。这也没什么不同!

  3. 但是,如果我使用 Applet 而不是 JApplet,那么 Applet 会接收键盘事件。但即使在这里,当我将面板添加到此 Applet 时(面板实际上是我所有的应用程序/绘画逻辑所在的位置),我再次停止接收 kb 事件(在我的面板中)!

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

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

我在这里非常需要某人的帮助。在过去的 2-3 天里,我尝试了各种我现在都不记得的排列方式。

我的平台详情:

  1. 火狐 3.5.3

  2. x86 上的 Fedora 11(带有最新更新/补丁)

  3. Java Plugin:这两个都试过了,没什么区别。

    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编译我的applet源码。

这是我的代码。非常感谢听到我的程序员同事的来信……因为我完全被困住了!

谢谢,

/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>
4

3 回答 3

3

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

至于 KeyListener 不能像 Applet 那样对 JApplet 起作用,你应该使用 KeyEventDispatcher 接口。

public class AppletMain extends JApplet implements

java.awt.KeyEventDispatcher

此外,您必须将 KeyboardFocusManager 设置为 Panel

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);

之后重写接口的dispatchKeyEvent函数:

@Override
public boolean dispatchKeyEvent(KeyEvent e);

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

于 2010-12-20T22:21:24.623 回答
2

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

于 2011-11-01T07:26:33.653 回答
1

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

于 2011-04-07T20:24:41.223 回答