0

My problem is explained in the following scenario

There are 2 JTextField objects. Let's give them variable names as jTextField1 and jTextField2. And the current focus owner is jTextField2. And the User and/or a Device is firing key inputs into the program. But according to the speed of each key being pressed and released the program should decide which text field the key char of that key input should be entered into. For an example, if the difference between KEY_PRESSED and KEY_RELEASED is less than or equal to 50 milliseconds, the Key Char should be typed into jTextField1 and never into jTextField2 but while the Focus is still owned by jTextField2 and unchanged. If the difference between the events are greater than 50 milliseconds, the text will be typed into its current Focus Owner which is jTextField2 (Or it may be any other object too according to what the User has the Focus at the moment.). So if there were 2 simultaneous activities happening, for an example a user is typing keys in a speed of greater than 50 milliseconds per key typing, and another device like a Barcode Scanner is firing Key Events in a speed less than 50 milliseconds, both of these inputs should be entered or typed into those different text fields separately according to their typing speeds while the focus owner is always at the object which the user is interacting with.

Here is the current code I have written which works well but with the problem that when keys are pressed in a speed less than 50 milliseconds per key, it sets at jTextField1 but it also gets typed at jTextField2.

@Override
public boolean dispatchKeyEvent(KeyEvent e) {
    if (e.getID() == KeyEvent.KEY_PRESSED) {
        millis = System.currentTimeMillis();
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            enter1 = true;
        }
    } else if (e.getID() == KeyEvent.KEY_RELEASED) {
        if ((System.currentTimeMillis() - millis) <= 10) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                enter2 = true;
            } else {
                barcodeStringBuilder.append(e.getKeyChar());
            }

            if (enter1 && enter2) {
                compo = getFocusOwner();
                jTextField1.setText(barcodePool.toString());
                barcodeStringBuilder.setLength(0);
                compo.requestFocus();
            }
            enter1 = false;
            enter2 = false;
        } else {
        }
    } else if (e.getID() == KeyEvent.KEY_TYPED) {
    }
    return false;
}

The previous attempt I made to accomplish this task was trying to handle the input of the two devices which are a Keyboard and a Barcode Scanner separately using the Java HID API which also was unsuccessful. You can find my question thread on it here. And then I made it into this option which so far seems to be a good option.

So, does anyone know an effective way to accomplish my task as I have described above?

Thank you! And your help is highly appreciated.

Community
  • 1
  • 1
RocketRuwan
  • 223
  • 1
  • 3
  • 14

1 Answers1

2

I would not give either JTextFields focus, would not use a KeyEventDispatcher, but would instead try to use Key Bindings, and then based on the timing, append the text into the appropriate text field. This would prevent focus issues sending the text to two text fields.

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
  • 1
    my view is DocumentListener for mirroring, delay for KEY_PRESSED and KEY_RELEASED came from, is exclusively settings in Native OS and is required to consume(again my view) – mKorbel Jan 18 '14 at 20:28