Я не могу получить свой JPanel в моем JApplet, чтобы получать события клавиатуры. Я НЕ МОГУ ПОТЕРЯТЬ, почему!JApplet/JPanel не принимает события KeyListener!
Обратите внимание, что ...
Нажатие на панель (с помощью мыши), прежде чем печатать не делает никакой разницы. Это, безусловно, самый общий совет, который я вижу в Интернете.
Я попытался использовать интерфейс java.awt.KeyEventDispatcher с низким уровнем. И это тоже не отличается!
Однако, если я использую Applet вместо JApplet, тогда апплет принимает события клавиатуры. Но даже здесь, когда я добавляю панель в этот апплет (на панели действительно присутствует вся моя логика приложения/рисования), я снова перестаю получать события kb (в моей панели)!
Теперь я не могу просто использовать Applet (вместо JApplet), потому что, помимо всего прочего, его onPaint получает Graphics (вместо объекта Graphics2D). Итак, №3 НЕ является решением для меня.
Вещи работают как шарм в AppletViewer, который поставляется с JDK.
Мне отчаянно нужна чья-то помощь здесь. Пробыл последние 2-3 дня, пробовав все виды перестановок, о которых я даже не помню.
Мои платформы детали:
Firefox 3.5.3
Fedora 11 на x86 (с последними обновлениями/патчи)
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
Использовал выше 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 Viewer, Win XP, Java 1.6.0_16. – Pool
Эй, Ник, как я уже говорил в Примечании № 5 выше, он отлично работает и для Applet Viewer. – Harry
Прости, пропустил это. Я просто тестировал его в браузере, FF3.5, IE8 и Chrome 3 под XP, и все они работали нормально для меня. Похоже, что это довольно изолированная версия для Fedora. – Pool