Swing中读取条码扫描器的方法

8
我安装了一款来自Datalogic的条形码扫描仪,目的是将条形码读入Java文本字段中。然而,在Swing中扫描条形码时,结果文本是垃圾字符,无法使用。在独立的java.awt.TextField上工作正常,但将其集成到我的代码中后,也会产生垃圾非可映射字符。不知道是否需要特定的JAVA驱动程序,我已经尝试将字符串从UTF-8转换为ISO-88...,但没有成功。已经徒劳地看了两天了,非常感谢任何帮助。谢谢!-innocent

4
大多数条形码扫描器模拟键盘 -- 就Java而言,它应该像输入文本一样操作。 但是扫描仪通常也可以配置为不同的模式,这可能涉及额外的控制字符,可能会干扰文本。您的扫描仪在扫描到文本文档时是否正常工作? 扫描仪是否有可能影响的配置选项? 扫描仪的确切型号是什么? - Russell Zahniser
1
另外,为了调试,请在字段上添加一个键监听器,以打印出所有“keyTyped”字符(以及可能的按键和释放键代码)。您可以很容易地识别出问题的按键,并将它们映射到无操作动作,以便它们不会输出为文本。 - Russell Zahniser
2
谢谢。可以在非swing文本字段中实现,但是当我将其集成到我的主程序中时,出现了错误。我添加了一个KeyListener来捕获输入的文本,但是这个文本也是乱码的。我仍在进一步调试中。扫描仪是Datalogic QW2100。 - user3524961
这可能会有帮助:https://dev59.com/EWrWa4cB1Zd3GeqP7y3x?rq=1 - QGA
你解决了吗? - David Bullock
显示剩余3条评论
2个回答

1
尝试将扫描仪重置以删除可能设置的所有虚假字符/代码; 即根据参考指南,扫描仪默认会将gs1-128代码的条形码ID作为转义序列发送,这可能会对Swing造成一些麻烦。
http://www.datalogic.com/eng/quickscan-i-lite-qw2100-pd-163.html下载产品参考指南。
扫描条形码进入编程模式。
转到相关部分并扫描代码以删除所有前导符和删除所有代码的目标标签。
您还可以尝试不同类型的键盘仿真和代码页。

0

使用ALT + NumPad方法从条形码扫描器发送的键事件存在问题。当按下 ALT 键时,Java 会生成带有随机输出的 KeyTyped 事件。这个问题存在于当前版本的 Java 7 和 Java 8 JRE 中(我已在 Windows 8、Windows 7 和 Ubuntu 14 上测试了 JRE 7u67 和 JRE 8u20)。

我的解决方案是注册一个 KeyEventDispatcher,在 ALT 方法处于活动状态时阻止 KeyEvents:

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
    new AltBugFixKeyEventDispatcher());

public class AltBugFixKeyEventDispatcher implements KeyEventDispatcher {

    private int i = -1;

    @Override
    public boolean dispatchKeyEvent(KeyEvent ke) {
        if (ke.isAltDown()) {
            switch (ke.getID()) {
                case KeyEvent.KEY_PRESSED:
                    if(ke.getKeyCode() == KeyEvent.VK_ALT){
                        i = 0;
                    }else if(Character.isDigit(ke.getKeyChar())){
                        i++;
                    }else{
                        i = -1;
                    }
                    break;
                case KeyEvent.KEY_RELEASED:
                    break;
                case KeyEvent.KEY_TYPED:
                    break;
            }
            if(i != -1){
                return true;
            }
        }
        return false;
    }
}

我认为,请给出事实。 - tod
1
谢谢,tod,我已经更正了描述。无论如何,在没有这个hack的情况下,ALT + NumPad模式下无法进行条形码扫描,我已经寻找解决方案3年了!这个bug给我造成了很多收入损失。我不明白为什么Java中一个如此严重和基本的问题仍然没有得到解决。 - JHead
因为如果您需要任意扩展ASCII数据,则需要直接从串行端口读取。 - Lorenzo Boccaccia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接