2009-11-02 78 views
3

我無法讓我的JApplet中的JPanel接收鍵盤事件。我不能爲什麼!JApplet/JPanel沒有收到KeyListener事件!

注意打字之前...

  1. 點擊面板(鼠標)沒有什麼區別。這是我在網上看到的最常見的建議。

  2. 我已經嘗試使用'低級'java.awt.KeyEventDispatcher接口。這也沒有什麼不同!

  3. 但是,如果我使用Applet代替JApplet,那麼Applet會接收鍵盤事件。但即使在這裏,當我爲這個Applet添加一個Panel(Panel實際上是我所有的應用/繪製邏輯所在的地方)時,我再次停止接收kb事件(在我的Panel中)!

  4. 現在,我不能簡單地使用Applet(而不是JApplet),因爲其中的onPaint獲取Graphics(而不是Graphics2D對象)。所以,#3對我來說不是一個解決方案。

  5. 事情就像JDK附帶的AppletViewer中的魅力一樣。

我非常需要別人的幫助。花了2-3天嘗試各種各樣的組合,我現在甚至都不記得。

我的平臺詳細信息:

  1. 火狐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 /插件/ 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查看器,Win XP,Java 1.6.0_16。 – Pool 2009-11-03 14:08:49

+0

嘿,尼克,正如我在上面的註釋#5中所說的那樣,它在Applet查看器中對我也很好。 – Harry 2009-11-03 15:52:49

+2

對不起,錯過了。我只是在XP下用瀏覽器,FF3.5,IE8和Chrome 3進行了測試,它們對我來說都工作得很好。它看起來像是一個孤立的Fedora插件問題。 – Pool 2009-11-04 01:07:02

回答

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

這使您可以像使用KeyListener一樣捕獲KeyEvents 。

1

我在使用firefox 3.6.11和3.6.14的Ubuntu 9.04和10.10中有sun-java-6軟件包和openjdk軟件包的問題。我發現了兩種解決方法:使用Applet而不是JApplet,或者實現在mousePressed(..)函數中調用「requestFocus()」的MouseListener。

2

我調查了與當前項目相關的問題,並探討了JApplet類的可聚焦性問題。
這是因爲爲什麼setFocusable(true);決定了這個問題。
您最終還可能需要添加焦點捕獲調用,例如requestFocusInWindow();,以使其工作正常。

+0

setFocusable(true)爲我工作。謝謝! – Pikamander2 2015-04-23 20:27:40