3

JApplet 内で JPanel を取得してキーボード イベントを受け取ることができません。なぜだかわかりません!

ご了承ください...

  1. 入力する前に(マウスで)パネルをクリックしても違いはありません。これは、ネット上で私が目にする最も一般的なアドバイスです。

  2. 「低レベル」の java.awt.KeyEventDispatcher インターフェイスを使用してみました。それも違いはありません!

  3. ただし、JApplet の代わりにアプレットを使用すると、アプレットはキーボード イベントを受け取ります。しかし、ここでも、このアプレットにパネルを追加した瞬間 (パネルは実際にはすべてのアプリ/描画ロジックがある場所です)、(パネルで) kb イベントの受信を再び停止します!

  4. 現在、(JApplet の代わりに) Applet を単純に使用することはできません。これは、とりわけ、その onPaint が (Graphics2D オブジェクトではなく) Graphics を取得するためです。したがって、#3は私にとって解決策ではありません。

  5. JDK に付属している AppletViewer では、物事は魔法のように機能します。

ここでどうしても誰かの助けが必要です。過去 2 ~ 3 日間、あらゆる種類の順列を試して過ごしましたが、今では思い出せません。

私のプラットフォームの詳細:

  1. Firefox 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 を使用して、アプレット ソースをコンパイルしました。

これが私のコードです。私の仲間のプログラマーからの連絡をお待ちしております...私は完全に立ち往生しています!

ありがとう、

/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

私はネットでこれを見つけました、そしてそれは私のために問題を解決します:

JApplet では KeyListener が Applet の場合のように機能しないという事実については、KeyEventDispatcher インターフェイスを使用する必要があります。

public class AppletMain extends JApplet implements

java.awt.KeyEventDispatcher

さらに、KeyboardFocusManager を Panel に設定する必要があります。

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);

その後、インターフェイスの dispatchKeyEvent 関数をオーバーライドします。

@Override
public boolean dispatchKeyEvent(KeyEvent e);

これにより、KeyListener で行われるように KeyEvents をキャッチできます。

于 2010-12-20T22:21:24.623 に答える
2

現在のプロジェクトに関連する問題を調査し、JApplet クラスのフォーカス可能性に関するいくつかの問題を調査しました。
それは、なぜsetFocusable(true);その問題を決めたからです。
また、適切に機能させるために、最終的にフォーカスキャプチャ呼び出しを追加する必要がある場合もありますrequestFocusInWindow();

于 2011-11-01T07:26:33.653 に答える
1

この問題は、Firefoxバージョン3.6.11と3.6.14を使用するUbuntu9.04と10.10の両方のsun-java-6パッケージとopenjdkパッケージで発生しました。2つの回避策を発見しました。JAppletではなくアプレットを使用するか、mousePressed(..)関数で「requestFocus()」を呼び出すMouseListenerを実装します。

于 2011-04-07T20:24:41.223 に答える