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

Dee*_*pak 10 java swing

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

编辑

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

Jan*_*cak 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());
        }
    }

});
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是用户只需用键盘按下某些键然后按ENTER键,应用程序就会将其作为捕获的条形码.此外,并非每个条形码阅读器都会发送一个ENTER后缀字符 (2认同)

Cyr*_*ith 6

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

}
Run Code Online (Sandbox Code Playgroud)