2009-11-02 3 views
3

Я не могу получить свой JPanel в моем JApplet, чтобы получать события клавиатуры. Я НЕ МОГУ ПОТЕРЯТЬ, почему!JApplet/JPanel не принимает события KeyListener!

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

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

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

  3. Однако, если я использую Applet вместо JApplet, тогда апплет принимает события клавиатуры. Но даже здесь, когда я добавляю панель в этот апплет (на панели действительно присутствует вся моя логика приложения/рисования), я снова перестаю получать события kb (в моей панели)!

  4. Теперь я не могу просто использовать Applet (вместо JApplet), потому что, помимо всего прочего, его onPaint получает Graphics (вместо объекта Graphics2D). Итак, №3 НЕ является решением для меня.

  5. Вещи работают как шарм в AppletViewer, который поставляется с JDK.

Мне отчаянно нужна чья-то помощь здесь. Пробыл последние 2-3 дня, пробовав все виды перестановок, о которых я даже не помню.

Мои платформы детали:

  1. Firefox 3.5.3

  2. Fedora 11 на x86 (с последними обновлениями/патчи)

  3. Java Plugin: пытался как из них, не имело никакого значения.

    3,1 IcedTea Java Web Browser Plugin 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 Viewer, Win XP, Java 1.6.0_16. – Pool

+0

Эй, Ник, как я уже говорил в Примечании № 5 выше, он отлично работает и для Applet Viewer. – Harry

+2

Прости, пропустил это. Я просто тестировал его в браузере, FF3.5, IE8 и Chrome 3 под XP, и все они работали нормально для меня. Похоже, что это довольно изолированная версия для Fedora. – Pool

ответ

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); 

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

1

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

2

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

+0

setFocusable (true) работал для меня. Благодаря! – Pikamander2

Смежные вопросы