【问题标题】:Java swt KeyListener "solution" barcode readingJava swt KeyListener“解决方案”条码读取
【发布时间】:2013-07-01 09:54:06
【问题描述】:

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

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

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)。

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

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

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

与我非常接近的相关主题是herehere

谢谢。

编辑

经过深思熟虑后,我找到了解决方案,我将把这个 Q 留在这里,仅供其他可能发现它可用的用户使用。

解决方案 --移到回答+编辑

【问题讨论】:

  • 您可以发布您的解决方案作为答案,如果它解决了您的问题,请选择它。但是,我认为您的代码不会像您认为的那样做。您说“整个条形码在大约 1 秒内写入”,但您的代码允许在两次击键之间经过 1 秒,并且仍然将输入视为扫描仪输入! “我没有条形码输入字段”,您是否有其他输入字段并且您正试图阻止扫描的数据进入这些字段?
  • 无论何时 /r/n 传递给程序循环都是“关闭”的,因此会读取条形码。我将时间更改为 200 毫秒,我担心系统“滞后”。我认为这段代码满足了我的需求,我知道它并不完美,但在这件事上,我将更新我的解决方案,因为我也做了一些更改。我知道我可以发布答案,但我必须等待 2 (1?) 天才能接受。不会有 Java 输入,而是 HTML 输入。 Java 程序只是用来读取条形码并将它们发送到网页。
  • 我也不担心将用户手动输入与条形码混合。在“编辑”模式下,条码扫描器将被“关闭”(在软件方面)。如果您觉得需要,请提出更多建议。
  • 请参阅stackoverflow.com/a/22084579/320594 了解替代方案(尽管尚未准备好投入生产)

标签: java swt barcode-scanner keylistener


【解决方案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();
        }
    }

    ...
}

【讨论】:

    【解决方案2】:

    这段代码涵盖了我想要实现的所有内容,它只读取数字(实际上是 F 键下的数字,而不是数字键盘上的数字,我遇到了问题,因为扫描仪依赖于键盘,所以我创建了函数 signsToNumbers()将符号!@#$%^&amp;*() 转换为数字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;
        }        
      }
    });
    

    【讨论】:

    • 请用计时器本身提供您的答案!
    • 什么意思?我使用系统计时器。
    • 我认为如果你可以通过额外的 timer en timertask 扩展你的答案会很酷。
    • 对不起,这已经 2 岁了 :(,我没有实际代码了,请随意扩展答案。这是一次 java 工作,我不熟悉 java。
    • 没关系!感谢您的快速回复:)
    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多