无需文本框即可在内部从条形码扫描仪获取输入

时间:2011-07-18 14:21:28

标签: java swing

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

修改

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

3 个答案:

答案 0 :(得分:7)

由于条形码扫描仪只是一个在读取每个条形码后发送键码和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());
        }
    }

});

答案 1 :(得分:7)

由于无法通过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);
}

}

答案 2 :(得分:1)

在某种程度上类似于@Cyrusmith的解决方案,我创造了一个概念证明&#39;解决方案(现在有几个限制,但是你被邀请修复它们:))试图在这篇文章中解决以前解决方案的限制:

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

请参阅https://stackoverflow.com/a/22084579/320594