【问题标题】:How can I Listen for Keyboard input without Text Field Java如何在没有文本字段 Java 的情况下监听键盘输入
【发布时间】:2012-08-24 17:26:15
【问题描述】:

我正在开发一个 Java 应用程序并与充当键盘输入设备的 RFID 阅读器进行交互。

该应用程序将用于员工时间跟踪,因此员工不应看到他/她的 RFID 标签包含的代码。

目前,应用程序打开一个 jFrame,要求员工扫描他们的标签。这是我想听键盘输入的地方。

所有的 RFID 标签都是 10 位数字,所以如果可能的话,我想使用某种正则表达式来检测卡片何时被扫描。

如果有人能指出我正确的方向,或者提供一些代码,我将不胜感激。

提前致谢。

更新:

通过将以下内容添加到我的 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) { }
});

所以现在确认阅读器只是标准键盘输入。

这是我为标签获得的示例:0006459027

现在,最大的问题是,我如何获取我得到的字符,并检测它是一个 10 位数的字符串,并从那里触发一个事件以打开一个新帧?

【问题讨论】:

    标签: java keyboard rfid


    【解决方案1】:

    首先,我会查看 RFID 阅读器是否在扫描标签时触发 ActionEvent。这将是最简单的方法。

    否则,您需要将DocumentListener 附加到文档基础字段并监控更改。

    您需要决定如何最好地中断结果(因为您可能一次获得 RFID 的每个字母)。您可以监控文档的长度,或者在短暂延迟后触发 javax.swing.Timer(您可以在 DocumentListener 触发的每个更新事件上重置计时器)

    退房

    我建议您也看看DocumentFilter,但您对最终结果感兴趣,而不是修改它。

    使用 DocumentListener 示例更新

    // 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 ;)
    //////
    

    当您“触发”代码事件时,我会做的一件事是,一旦您从文本字段中读取它,就清除文本字段 (JTextField.setText(null)) - 恕我直言

    【讨论】:

    • 太棒了!谢谢!刚刚添加到 add(field) 中,实际上没有显示字段。
    • @MikeGeorge 字段的添加可以随时发生,与答案无关(尽管提一下还是个好主意;))
    • 再问一个问题,如何重置 DoucumentListener 以便在需要时扫描另一个标签?
    • @MikeGeorge 这是我帖子的最后一段。从文本字段中读取 RFID 后,将其文本设置为 null 或空 String - JTextField.setText(null),这会将文档重置为空文档
    • 如果我在 handleUpdate 方法中这样做,我会得到:“无法从静态上下文引用非静态方法 setText(String)”
    【解决方案2】:

    如果 RFID 阅读器充当键盘输入设备,请尝试使用key events

    JFrame frame = new JFrame();
    
    // frame setup
    
    frame.addKeyListener(new KeyAdapter(){
    
        public void KeyPressed(KeyEvent ke)
        {
    
            System.out.println(ke);
    
        }
    
    });
    

    否则你必须检查它触发了哪种事件。

    【讨论】:

    • 在使用 NetBeans 生成扩展 javax.swing.JFrame 的“表单”后实现此功能的任何提示?
    • 我没有 NetBeans 知识 :/ 但是在任何可以引用框架的地方,您都可以按照我上面建议的方式添加一个 keyListener,只需一些键,您就会在控制台。
    • @moonwave99 我会非常小心使用KeyListener 虽然不是完全错误,但很容易规避
    • @MadProgrammer 我同意,我更关心制作这种塑料的东西。应该有办法只拦截设备的事件。
    【解决方案3】:

    我也遇到过类似情况,但使用的是条形码扫描仪。

    我真的很努力地设计了一个自定义的DocumentListener,它可以处理所有场景,但没有一个能奏效。

    出于绝望,我添加了一个ActionListener,然后效果很好。

    这是一个代码快照:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 2014-07-01
      • 1970-01-01
      • 2015-07-12
      相关资源
      最近更新 更多