Name: eh37734 Date: 10/16/98
The following is a report that I compiled related
to KeyEvents on different platforms. This appears
to be a very big obstacle to cross platform capability.
The programmer should not have to see which OS is
running in order to get consistent user input.
I have found a number of bugs that seem to describe
something close to the problems listed here. None
of them seem to have a complete understanding of
the problem though. I hope this test app help.
------
Differences between System Keyboards 8-6-98
WinNT system information:
Java 1.1.6: Sun Microsystems Inc.
java API version: 45.3
x86 Windows NT 4.0
Character encoding: 8859_1
Character encoding package: sun.io
Solaris system information:
Java 1.1.5: Sun Microsystems Inc.
java API version: 45.3
sparc Solaris 2.x
Character encoding: 8859_1
Character encoding package: sun.io
Columns on left were output on WinNT by KeyCodeTester.java. Comments on right compare the Solaris keyboard to these Windows keys.
event char code text comments
KeyPressed 122 F11 "stop" key on Solaris, not F11
KeyPressed 123 F12 "again" key on Solaris, not F12
"printscrn" NOT reported on Solaris or Win
KeyPressed 145 Scroll Lock NOT reported on Solaris
KeyPressed 19 Pause NOT reported on Solaris
KeyPressed - 189 Unknown keyCode: 0xbd unknown code 0 on Solaris
KeyPressed = 187 Unknown keyCode: 0xbb known code 61 on Solaris
(see windows keys below for matching codes)
KeyPressed [ 219 Unknown keyCode: 0xdb known code 91 on Solaris
KeyPressed \ 220 Unknown keyCode: 0xdc known code 92 on Solaris
KeyPressed ] 221 Unknown keyCode: 0xdd known code 93 on Solaris
(Windows keys)
KeyPressed 91 [ left Windows key
KeyPressed 92 \ right Windows key
KeyPressed 93 ] property key
KeyPressed ; 186 Unknown keyCode: 0xba known code 59 on Solaris
KeyPressed , 188 Unknown keyCode: 0xbc known code 44 on Solaris
KeyPressed . 190 Unknown keyCode: 0xbe known code 46 on Solaris
KeyPressed / 191 Unknown keyCode: 0xbf known code 47 on Solaris
(keypad 5)
KeyPressed 12 Clear Not reported on Solaris
Columns on left were output on Solaris by KeyCodeTester.java. These keys are unique to Solaris.
KeyPressed 156 Help
KeyPressed 157 Meta
KeyPressed 21 Kana
Other issues between WinNT and Solaris.
Toggle keys (Caps Lock and Num Lock) on Solaris report a key pressed event when it is toggled on (light comes on) and a key released event when it is toggled off (light goes out). On the Windows side a key pressed event is reported when the key is pressed and a key released event is reported when the key is released. It does not matter if it is toggling the function on and off.
Also, The control keys (Ctrl, Alt, and Shift) are reported as down for key pressed, key typed, and key released events on Windows. On Solaris they are not reported as down for the key typed event.
On the Solaris the unlabeled key near the help key, props, undo, front, copy, open, paste, find, cut, F11, and F12 keys do not report events.
Macintosh system information:
Java 1.1.3: Apple Computer, Inc.
java API version: 45.3
Power PC Mac OS 8.1
Character encoding: MacTEC
Character encoding package: sun.io
Columns on left were output on WinNT by KeyCodeTester.java. Comments on right compare the Macintosh laptop keyboard to these Windows keys.
event char code text comments
KeyPressed 27 Escape esc reported as clear (code 12) on mac
KeyPressed 8 Backspace Labeled as "Delete" on Mac
KeyPressed - 189 Unknown keyCode: 0x0 known code 109 "NumPad -" on Mac
KeyPressed = 187 Unknown keyCode: 0xbb known code 61 on Mac
(see windows keys below for matching codes)
KeyPressed [ 219 Unknown keyCode: 0xdb known code 91 on Mac
KeyPressed \ 220 Unknown keyCode: 0xdc known code 92 on Mac
KeyPressed ] 221 Unknown keyCode: 0xdd known code 93 on Mac
(Windows keys)
KeyPressed 91 [ left Windows key
KeyPressed 92 \ right Windows key
KeyPressed 93 ] properties key
KeyPressed ; 186 Unknown keyCode: 0xba known code 59 on Mac
KeyPressed , 188 Unknown keyCode: 0xbc known code 44 on Mac
KeyPressed . 190 Unknown keyCode: 0xbe known code 46 on Mac
KeyPressed / 191 Unknown keyCode: 0xbf known code 47 on Mac
Other issues with the Mac.
On the Mac the Caps Lock, Shift, Ctrl, Option and Open Apple keys do not report events. They do on Windows (not Open Apple, obviously).
The problem here seems to be with the Windows operating system. It responds correctly to the improperly mapped key codes. The proper place to handle this is in the VM, not the KeyEvent.
The Code: KeyCodeTester.java
import com.sun.java.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* KeyCodeTester can be used to compare keyboard key codes from different Java
* virtual machines
*/
public class KeyCodeTester extends java.awt.Frame
implements ActionListener,
KeyListener,
WindowListener
{
Panel topPanel;
TextField keyInput;
TextArea output;
Label label1;
Button Clear;
Checkbox allEvents;
public KeyCodeTester()
{
setLayout(new BorderLayout());
setVisible(false);
setSize(600,340);
topPanel = new Panel();
label1 = new Label(" Type a key.");
topPanel.add(label1);
keyInput = new TextField();
topPanel.add(keyInput);
Clear = new Button();
Clear.setLabel("Clear TextArea");
topPanel.add(Clear);
allEvents = new Checkbox("Report All Events");
topPanel.add(allEvents);
add(topPanel, BorderLayout.NORTH);
output = new TextArea();
add(output, BorderLayout.CENTER);
setTitle("KeyCodeTester");
keyInput.addKeyListener(this);
Clear.addActionListener(this);
this.addWindowListener(this);
}
static public void main(String args[])
{
KeyCodeTester keyCodeTester = new KeyCodeTester();
keyCodeTester.setVisible(true);
keyCodeTester.getSystemInfo();
}
void getSystemInfo()
{
output.appendText("Java " + System.getProperty("java.version") + ": "
+ System.getProperty("java.vendor") + "\n"
+ "java API version: " + System.getProperty("java.class.version") + "\n"
+ System.getProperty("os.arch") + " "
+ System.getProperty("os.name") + " "
+ System.getProperty("os.version") + "\n"
+ "Character encoding: " + System.getProperty("file.encoding") + "\n"
+ "Character encoding package: " + System.getProperty("file.encoding.pkg") + "\n");
output.append("Event\t\tChar\tCode\tKey Code Text [Modifier Text]\n");
}
public void keyPressed(KeyEvent event)
{
if (event.getSource() == keyInput)
{
outputKeyInfo(event);
if(allEvents.getState() == false)
{
keyInput.setText("");
}
}
}
public void keyTyped(KeyEvent event)
{
if(allEvents.getState() == false)
{
return;
}
if (event.getSource() == keyInput)
{
outputKeyInfo(event);
}
}
public void keyReleased(KeyEvent event)
{
if(allEvents.getState() == false)
{
return;
}
if (event.getSource() == keyInput)
{
outputKeyInfo(event);
keyInput.setText("");
}
}
void outputKeyInfo(KeyEvent event)
{
char keyChar = event.getKeyChar();
int keyCode = event.getKeyCode();
String keyModifiersText = event.getKeyModifiersText(event.getModifiers());
String eventText;
switch(event.getID()) {
case KeyEvent.KEY_PRESSED:
eventText = "KEY_PRESSED";
break;
case KeyEvent.KEY_RELEASED:
eventText = "KEY_RELEASED";
break;
case KeyEvent.KEY_TYPED:
eventText = "KEY_TYPED";
break;
default:
eventText = "unknown type";
}
output.append(eventText + "\t");
if(event.isActionKey())
{
output.appendText("\t");
}
if(keyChar == '\0' || keyChar == '\n')
{
output.appendText("\t");
}
else
{
output.appendText(keyChar + "\t");
}
output.appendText(keyCode + "\t");
output.appendText(event.getKeyText(keyCode));
if(!keyModifiersText.equals(""))
{
output.appendText(" [" + keyModifiersText + "]");
}
output.appendText("\n");
}
public void actionPerformed(ActionEvent event)
{
if (event.getSource() == Clear)
{
output.setText("");
keyInput.setText("");
getSystemInfo();
}
}
public void windowClosing(WindowEvent event)
{
if (event.getSource() == KeyCodeTester.this)
{
setVisible(false); // hide the Frame
dispose(); // free the system resources
System.exit(0); // close the application
}
}
public void windowOpened(WindowEvent event)
{
}
public void windowClosed(WindowEvent event)
{
}
public void windowIconified(WindowEvent event)
{
}
public void windowDeiconified(WindowEvent event)
{
}
public void windowActivated(WindowEvent event)
{
}
public void windowDeactivated(WindowEvent event)
{
}
}
(Review ID: 36831)
======================================================================