我無法讓我的JApplet中的JPanel接收鍵盤事件。我不能爲什麼!JApplet/JPanel沒有收到KeyListener事件!
注意打字之前...
點擊面板(鼠標)沒有什麼區別。這是我在網上看到的最常見的建議。
我已經嘗試使用'低級'java.awt.KeyEventDispatcher接口。這也沒有什麼不同!
但是,如果我使用Applet代替JApplet,那麼Applet會接收鍵盤事件。但即使在這裏,當我爲這個Applet添加一個Panel(Panel實際上是我所有的應用/繪製邏輯所在的地方)時,我再次停止接收kb事件(在我的Panel中)!
現在,我不能簡單地使用Applet(而不是JApplet),因爲其中的onPaint獲取Graphics(而不是Graphics2D對象)。所以,#3對我來說不是一個解決方案。
事情就像JDK附帶的AppletViewer中的魅力一樣。
我非常需要別人的幫助。花了2-3天嘗試各種各樣的組合,我現在甚至都不記得。
我的平臺詳細信息:
火狐3.5.3
的Fedora 11在x86(與最新的更新/補丁)
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
使用的在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>
您的代碼適用於我使用Applet查看器,Win XP,Java 1.6.0_16。 – Pool 2009-11-03 14:08:49
嘿,尼克,正如我在上面的註釋#5中所說的那樣,它在Applet查看器中對我也很好。 – Harry 2009-11-03 15:52:49
對不起,錯過了。我只是在XP下用瀏覽器,FF3.5,IE8和Chrome 3進行了測試,它們對我來說都工作得很好。它看起來像是一個孤立的Fedora插件問題。 – Pool 2009-11-04 01:07:02