How can I Listen for Keyboard input without Text Field Java

混江龙づ霸主 提交于 2020-01-03 03:31:09

问题


I am working on a Java application and interfacing with an RFID reader that acts as a keyboard input device.

The application will be used for employee time tracking, so the employee should not see the code that his/her RFID tag contains.

Currently, the application opens a jFrame that asks the employee to scan their tag. This is where I would like to listen for the keyboard input.

All of the RFID tags are 10 digits, so I would like to use some kind of regex to detect when a card is scanned if possible.

If someone could point me in the right direction, or contribute some code I would be grateful.

Thanks in advance.

UPDATE:

I was able to read the input of the scanner by adding the following to the constructor of my JFrame.

addKeyListener(new KeyListener(){
    @Override
    public void keyPressed(KeyEvent e){ System.out.print(e.getKeyChar());}
    @Override
    public void keyReleased(KeyEvent e) { }
    @Override
    public void keyTyped(KeyEvent e) { }
});

So it is now confirmed that the Reader is just standard Keyboard input.

Here is an example of what I get for a tag: 0006459027

Now, the big question is, how do I take the characters that I got, and detect that it is a 10 digit string, and from there trigger an event to open a new frame?


回答1:


First, I'd see if the RFID reader is triggering an ActionEvent to be fired when the tag is scanned. This would be the simplest approach.

Failing that, you would need to attach a DocumentListener to the fields underlying document and monitor for changes.

You'll need to decide how best to interrupt the results (as you're likely to get each letter of the RFID at a time). You could monitor the length of the document or have a javax.swing.Timer which triggers after a short delay (you'd reset the timer on each update event triggered by the DocumentListener)

Check out

  • JTextField.addActionListener
  • JTextField.getDocument().addDocumentListener

I'd suggest taking a look at DocumentFilter as well, but your interested in the final result, not modifying it.

UPDATED with DocumentListener Example

// In the classes variable decleration section...
private JTextField rfidField;

// In the classes constructor or UI init method...
rfidField = new JTextField(12);
rfidField.getDocument().addDocumentListener(new DocumentListener() {

    public void handleUpdate(DocumentEvent e) {

        if (e.getDocument().getLength() == 10) {

            System.out.println("Trigger me happy...");
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    rfidField.setText(null);
                }
            });

        }

    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        handleUpdate(e);
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        handleUpdate(e);
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        handleUpdate(e);
    }
});

// Now don't forget to add the field to your forms container ;)
//////

One of things I would be do when you "trigger" the code event is, once you've read it from the text field, is clear the text field (JTextField.setText(null)) - IMHO




回答2:


If the RFID reader acts as a keyboard input device, try with key events:

JFrame frame = new JFrame();

// frame setup

frame.addKeyListener(new KeyAdapter(){

    public void KeyPressed(KeyEvent ke)
    {

        System.out.println(ke);

    }

});

Otherwise you have to check which kind of event it fires.




回答3:


I was in a similar situation but with a bar-code scanner.

I really worked hard on a custom DocumentListener that would take care of all scenarios, and none of it worked.

Out of desperation, I added an ActionListener and it then worked very well.

Here is a code snap-shot :

try {
    txtStockItemRef.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println(txtStockItemRef.getText()); 
            DatabaseManager.peformStockItemLookupByBarcodeRef(txtStockItemRef.getText());
        } 
    }); 
} catch(Exception exc) {
    LiveCityRetailTools.handleExceptionWithUserMessage(exc);
}


来源:https://stackoverflow.com/questions/12189170/how-can-i-listen-for-keyboard-input-without-text-field-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!