【问题标题】:Getting input from barcode scanner internally without textbox在没有文本框的情况下在内部从条形码扫描仪获取输入
【发布时间】:2011-07-18 14:21:28
【问题描述】:

我有一个条形码扫描仪,在我的 java 应用程序中,当使用条形码扫描产品时,我必须弹出一个弹出窗口来显示数据库中与条形码相关的所有信息。我必须在内部处理这部分的应用程序上没有文本框。我该怎么做呢 ?有什么建议吗?我在 UI 上使用 swing。

编辑

条形码扫描仪是 USB 之一。如果我们扫描某些东西,它会将结果输出到具有焦点的文本框中。但是我没有在打开的页面上工作的文本框。我可以使用一些隐藏的文本框并读取那里的值吗?

【问题讨论】:

  • 我不知道你在问什么(不投反对票)。
  • 肯定需要更多细节。条码扫描器是您的应用程序的一部分还是第三方独立应用程序的一部分?你需要什么文本框字段?条码扫描器如何/应该/可以与您的应用程序通信?
  • 通常条形码扫描仪是普通的 HID 设备,其工作方式类似于键盘 - 将击键发送到任何具有焦点的窗口。您可以尝试在应用程序中捕获击键。
  • 是的,我可以获得击键,但是在我将焦点转移到文本字段之前,我如何通知应用程序已经开始发生击键?\
  • what's dataType (image, byte, stream...) 可能会被扫描仪输出捕获,API 或驱动程序必须说明这一点

标签: java swing


【解决方案1】:

由于条形码扫描仪只是一个在读取每个条形码后发送键码和 ENTER 的设备,因此我会使用按键监听器。

final Frame frame = new Frame();
frame.setVisible(true);

frame.addKeyListener(new KeyAdapter() {

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_ENTER) {
            // your code is scanned and you can access it using frame.getBarCode()
            // now clean the bar code so the next one can be read
            frame.setBarCode(new String());
        } else {
            // some character has been read, append it to your "barcode cache"
            frame.setBarCode(frame.getBarCode() + e.getKeyChar());
        }
    }

});

【讨论】:

  • 这个问题是用户可以用他的键盘按一些键,然后按 ENTER,应用程序会将其作为捕获的条形码。此外,并非每个条形码阅读器都会发送 ENTER 后缀字符
【解决方案2】:

由于无法通过 frame.addKeyListener 获取输入,我使用了这个使用 KeyboardFocusManager 的实用程序类:

public class BarcodeReader {

private static final long THRESHOLD = 100;
private static final int MIN_BARCODE_LENGTH = 8;

public interface BarcodeListener {

    void onBarcodeRead(String barcode);
}

private final StringBuffer barcode = new StringBuffer();
private final List<BarcodeListener> listeners = new CopyOnWriteArrayList<BarcodeListener>();
private long lastEventTimeStamp = 0L;

public BarcodeReader() {

    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() != KeyEvent.KEY_RELEASED) {
                return false;
            }

            if (e.getWhen() - lastEventTimeStamp > THRESHOLD) {
                barcode.delete(0, barcode.length());
            }

            lastEventTimeStamp = e.getWhen();

            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                if (barcode.length() >= MIN_BARCODE_LENGTH) {
                    fireBarcode(barcode.toString());
                }
                barcode.delete(0, barcode.length());
            } else {
                barcode.append(e.getKeyChar());
            }
            return false;
        }
    });

}

protected void fireBarcode(String barcode) {
    for (BarcodeListener listener : listeners) {
        listener.onBarcodeRead(barcode);
    }
}

public void addBarcodeListener(BarcodeListener listener) {
    listeners.add(listener);
}

public void removeBarcodeListener(BarcodeListener listener) {
    listeners.remove(listener);
}

}

【讨论】:

  • 很好的解决方案,但是有一些条码阅读器默认不发送 ENTER 键后缀,并且使用您的代码,如果最后没有发送 ENTER ,我无法捕获条码
【解决方案3】:

以某种类似于@Cyrusmith 解决方案的方式,我创建了一个“概念证明”解决方案(现在有一些限制,但请您修复它们:))试图解决本文中先前解决方案的限制:

  • 它支持在条形码字符串末尾不发送 ENTER 的条形码阅读器。
  • 如果当前焦点位于摆动文本组件上并且已捕获条码,则条码不会到达文本组件,而只会到达条码侦听器。

https://stackoverflow.com/a/22084579/320594

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    相关资源
    最近更新 更多