Hi,

I've noticed a problem with key events in applets - specifically, "key released" are being inappropriately generated for some keys and not generated at all for other keys. I have a small demo applet, live version is here:

http://bluej.org/davmac/KeyApplet.html

The code is below. The applet presents a text area with an empty JPanel beneath it. When you click the JPanel, it requests focus, and clears the text area, and then key events (pressed, typed and released) are reported in the text area. (Note that the entire applet initially appears grey; just click near the bottom to restore the correct appearance).

For letter keys, pressing and holding a key causes a repeating sequence:

key pressed
key typed
key released
key pressed
key typed
key released

This is clearly incorrect; there should only be one 'key pressed' and one 'key released' for each press/release of the key.

When an arrow key is pressed, held briefly and then released, the event sequence is:

key pressed
key pressed
key pressed

... with no 'key released' events generated at all.

So, there seems to be a bug with key event handling. Is this a known bug?

Thanks,
Davin


Code:

=== KeyApplet.java ===
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class KeyApplet extends JApplet
{
    private JPanel nPanel;

    public void init()
    {
        JRootPane rootPane = this.getRootPane();

        final JTextArea textArea = new JTextArea("", 20, 60);

        textArea.append("Running!\n");

        rootPane.setLayout(new BorderLayout());
        rootPane.add(textArea, BorderLayout.CENTER);

        nPanel = new JPanel()
        {
            public Dimension getPreferredSize()
            {
                return new Dimension(500, 40);
            }
        };

        nPanel.setFocusable(true);

        nPanel.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                try {
textArea.getDocument().remove(0, textArea.getDocument().getLength());
                }
                catch (Exception ble) {}
                textArea.append("Clicked!\n");
                nPanel.requestFocusInWindow();
            }
        });

        rootPane.add(nPanel, BorderLayout.SOUTH);

        nPanel.addKeyListener(new KeyListener() {
            public void keyTyped(KeyEvent e) {
                textArea.append("Key typed!\n");
            }
            public void keyReleased(KeyEvent e) {
                textArea.append("Key released!\n");
            }
            public void keyPressed(KeyEvent e) {
                textArea.append("Key pressed!\n");
            }
        });
    }

    public void start()
    {
        repaint();
        nPanel.requestFocusInWindow();
    }
}

Reply via email to