2

我在这里找到了一些关于我的问题的很好的问答,但找不到合适的。

我有一个条形码阅读器,它可以读取条形码并将扫描的代码作为键盘输入发送。没关系,我可以轻松捕捉输入

browser.addKeyListener(new KeyAdapter() {   
    @Override public void keyPressed(KeyEvent e) {
        if(e.keyCode >=48 && e.keyCode <=57) {
            System.out.println("number caught");
        } 
    }
});

但是我的应用程序中会有更多的输入,所以我需要知道它是通过条形码阅读器还是通过键盘发送的。我认为这可以通过在代码中添加一些计时器来验证某些“序列”读取的时间长度来实现。

我只是想不通,(我的意思是背后的逻辑),我缺少逻辑。

  1. 用户正在输入一些信息,(字母数字)
  2. 用户希望使用条码阅读器读取条码

我尝试了计时器,例如 if(System.currentTimeMillis() - lastPressProcessed ??? 500) {在触发 keyListener 之后,但我认为我错过了一些东西。

旁注: USB 条码读取代码速度很快,因此模拟击键的速度非常快,整个条码在大约 1 秒内写入 + 进位/r/n(也enter被按下)。

旁注2:条形码的长度会有所不同,所以我不能在短时间内读取一些长度并决定它是用户输入还是条形码输入(最大数字读取 13 + enter)。

旁注3:我没有条形码输入字段,我试图在“背景”上运行它。

我正在寻求有关主题的逻辑/伪代码建议。

与我非常接近的相关主题在这里这里

谢谢你。

编辑

经过深入研究后,我找到了解决方案,我将把这个 Q 留在这里,仅供其他可能觉得这个可用的用户使用。

解决方案 ——移至回答+编辑

4

2 回答 2

1

在这里你可以下载我的解决方案:

http://jhead.hu/resource/java/general/BarcodeReader.java

以下代码示例向您展示了如何使用它。当识别出新的条形码时,会生成一个 ActionEvent,您可以通过 getActionCommand() 方法获取条形码。如果面板未激活,您可以将字符进一步发送到焦点管理器。

唯一的问题是我的条码扫描器发送字符太快,所以字符位有时会混合。我还没有更好的解决方案。

public class PanelWithBarcodeReading extends javax.swing.JPanel implements ActionListener {

    private BarcodeReader barcodeReader = new BarcodeReader();

    public PanelWithBarcodeReading() {
        initComponents();
        barcodeReader.addActionListener(this);
        barcodeReader.setParent(this);
        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(barcodeReader);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (SwingUtilities.getWindowAncestor(this).isActive()) {
            System.out.println("BARCODE='" + e.getActionCommand() + "'");
        } else {
            barcodeReader.dispatchLastBarcodeAsKeyEvents();
        }
    }

    ...
}
于 2013-07-29T20:27:36.650 回答
0

这段代码涵盖了我想要实现的所有内容,它只读取数字(实际上是 F 键下的数字,而不是小键盘上的数字,我遇到了问题,因为扫描仪依赖于键盘,所以我制作signsToNumbers()了将符号转换!@#$%^&*()为数字的功能1234567890。我可能会更改此功能,因为键盘上的每个键都有自己的唯一标识符 + 修饰符,扫描仪似乎也将 SHIFT 修饰符发送到应用程序,但这并不像我会匹配的那样有问题e.keyCode

下面的代码工作如下:

  1. 等待数字输入,否则什么也不做
  2. 如果插入第一个数字,它会在if条件下循环,直到达到 200 毫秒或收到“\r\n”
  3. 通过 URL 向服务器发送数据

代码

@Override public void keyPressed(KeyEvent e) {
    if (timer == true && System.currentTimeMillis() - lastTimer < 200) {
      if(e.keyCode >=48 && e.keyCode <=57) { //number pressed
          lastTimer = System.currentTimeMillis();
          myString = myString + Character.toString(e.character);
        }
        if(e.keyCode == SWT.CR) {
          myString = signsToNumbers(myString);
          newUrl = browser.getUrl()+ "/newcode/" + myString;
          browser.setUrl(newUrl);
          text.setText(newUrl);
          System.out.println(myString);
          System.out.println("barcode read");
          myString = "";
          timer = false;
          lastTimer = 0;
        }
    }else{
        if(e.keyCode >=48 && e.keyCode <=57) {
          lastTimer = System.currentTimeMillis();
          timer = true;
          myString = Character.toString(e.character);
        }
        myString = "";
        lastTimer = 0;
    }        
  }
});
于 2013-07-02T07:33:12.413 回答