JApplet / JPanel не получает события KeyListener! - PullRequest
3 голосов
/ 02 ноября 2009

Я не могу получить свою JPanel в своем JApplet для получения событий клавиатуры. Я не могу понять, почему!

Обратите внимание, что ...

  1. Нажатие на панель (с помощью мыши) перед вводом не имеет значения. Это, безусловно, самый распространенный совет, который я вижу в Интернете.

  2. Я пытался использовать «низкоуровневый» интерфейс java.awt.KeyEventDispatcher. Это тоже ничем не отличается!

  3. Однако, если я использую апплет вместо JApplet, тогда апплет получает события клавиатуры. Но даже здесь, в тот момент, когда я добавляю Panel к этому апплету (на панели действительно находится вся логика моего приложения / рисования), я снова прекращаю получать события 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 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>

Ответы [ 3 ]

3 голосов
/ 21 декабря 2010

Я нашел это в сети, и это решает проблему для меня:

Что касается того, что делает KeyListener не работает для JApplet, как для Апплет вы должны использовать Интерфейс KeyEventDispatcher.

public class AppletMain extends JApplet implements

java.awt.KeyEventDispatcher

Кроме того, вы должны установить KeyboardFocusManager для панели

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);

После этого переопределить Функция dispatchKeyEvent Интерфейс:

@Override
public boolean dispatchKeyEvent(KeyEvent e);

Это позволяет вам поймать KeyEvents как это делается с KeyListener.

2 голосов
/ 01 ноября 2011

Я исследовал проблему, связанную с моим текущим проектом, и исследовал некоторые проблемы с фокусируемостью класса JApplet.
Это потому, что setFocusable(true); решил проблему.
Вам также может понадобиться добавить вызов захвата фокуса, например requestFocusInWindow();, чтобы он работал правильно.

1 голос
/ 08 апреля 2011

У меня была эта проблема с пакетами sun-java-6 и пакетами openjdk в Ubuntu 9.04 и 10.10 с firefox версий 3.6.11 и 3.6.14. Я обнаружил два обходных пути: используйте Applet вместо JApplet или реализуйте MouseListener, который вызывает функцию requestFocus () в функции mousePressed (..).

...