Duplicate :
|
|
Duplicate :
|
|
Relates :
|
AWT text components, eg java.awt.TextField, behave differently in terms of the Java event sequences which cause text to be input and displayed in these components Also they are different than the Swing components which are considered to demonstrate the correct behaviour. Here is a summary The types of Java key event are KeyPressed, KeyReleased and KeyTyped The JTextField enters input in response to a KeyTyped event and is unaffected by KeyPressed, KeyReleased. I would regard this as correct behaviour. Consuming the keyPressed event should not prevent the KeyTyped event from being generated. They are separate AWT events, and consuming that event prevents it being processed by components, it does not prevent the other event generation. In the AWT case however there are different behaviours between NT and Solaris NT: The TextField enters input in response to a KeyTyped event. Consuming the KeyTyped prevents the text from appearing, that is correct. But consuming the KeyPressed event also prevents the KeyTyped event being generated. This is wrong. i.e. NT apparently needs to see the KeyPressed AND the KeyTyped, but not the KeyReleased. It should not be dependent on KeyPressed (or KeyReleased) Solaris: The TextField enters input immediately in response to a KeyPressed event. This is wrong: it should use KeyTyped. This can be demonstarting by consuming the KeyTyped : it does not prevent input as its too late. There is a bug id 4069196 on this related issue. Because of this, bug 4069196 and this one needs to be fixed at the same time. ie consuming KeyPressed and KeyReleased events should have no bearing on KeyTyped events, or the interpretation of KeyTyped events by text components. ------------------- // adapted from the test case for bug # 4069196 import java.awt.*; import java.awt.event.*; public class Bug4114565 extends Frame implements WindowListener,ActionListener, KeyListener { public Bug4114565() { super(); setSize(300,300); setLayout(null); addNotify(); setFont(new Font("Helvetica", Font.PLAIN, 12)); Insets ii = getInsets(); textField1 = new TextField(12); textField1.addActionListener(this); textField1.addKeyListener(this); add(textField1); textField1.setBounds(ii.left + 24,ii.top + 90,96,32); setTitle("Key Event Test"); addWindowListener(this); } public Bug4114565(String title) { this(); setTitle(title); } private static void show_event(KeyEvent k,String source) { TextField t; char c; t = (TextField) k.getComponent(); int lgth = t.getColumns(); String s = t.getText(); System.out.println(source + " ->" + k + " getText ->" + s); if(lgth <= s.length()) { System.out.println("NO MORE CHARACTERS"); k.consume(); } return; } public void keyTyped(KeyEvent k) { k.consume(); // 4114565 (has no effect) show_event(k,"keyTyped"); } public void keyPressed(KeyEvent k) { show_event(k,"keyPressed"); // System.out.println("keyPressed ->" + k); // k.consume(); // 4114565 (since chars entered here, // this event must NOT be consumed } public void keyReleased(KeyEvent k) { show_event(k,"keyReleased"); // System.out.println("keyReleased ->" + k); // k.consume(); // 4114565 (has no effect) } public void actionPerformed(ActionEvent e) { System.out.println("actionPerformed ->" + e); } public void windowClosed(WindowEvent event) { } public void windowDeiconified(WindowEvent event) { } public void windowIconified(WindowEvent event) { } public void windowActivated(WindowEvent event) { } public void windowDeactivated(WindowEvent event) { } public void windowOpened(WindowEvent event) { } public void windowClosing(WindowEvent event) { if(true) { Component fc = this.getFocusOwner(); if(fc == null) System.out.println("getFocusOwner() is null"); else System.out.println("getFocusOwner() ->" + fc); setVisible(false); // hide the Frame dispose(); // free the system resources System.exit(0); } else System.out.println("System.exit() skipped"); } static public void main(String args[]) { Bug4114565 f1 = new Bug4114565(); f1.pack(); f1.setVisible(true); } TextField textField1; }
|