无需文本框即可在内部从条形码扫描仪获取输入
我有一个条形码扫描仪,在我的java应用程序中,当使用条形码扫描产品时,我必须带一个弹出窗口显示与数据库条形码相关的所有信息。 我没有关于应用程序的文本框我必须在内部处理这个部分。 我该怎么做呢 ? 有什么建议吗? 我正在使用swing for UI。
编辑
条码扫描器是USB的。 如果我们扫描某些内容,它会将结果输出到具有焦点的文本框中。 但我打开的页面上没有文本框。 我可以使用一些隐藏的文本框并在那里读取值吗?
由于条形码扫描仪只是一个在读取每个条形码后发送键码和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()); } } });
由于无法通过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 listeners = new CopyOnWriteArrayList (); 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); } }
在某种程度上类似于@Cyrusmith解决方案,我创建了一个“概念certificate”解决方案(现在有几个限制,但是你被邀请修复它们:))试图解决这篇文章中先前解决方案的限制:
- 它支持条形码阅读器,它不会在条形码字符串末尾发送ENTER。
- 如果焦点当前在摆动文本组件上并且捕获了条形码,则条形码不会到达文本组件而只会到达条形码侦听器。
请参阅https://stackoverflow.com/a/22084579/320594
- 带有OUT参数的Java MyBatis存储过程调用
- 如何在Java中使用XSLT 2.0和XSLT 3.0?
- 在Java中,如何使用JUnitvalidation抛出的exception?
- Spring Amqp在springframework RetryCallback类中有NoClassDefFoundError
- Java客户端应用程序中的Ajax调用
- 在java中使用pdfbox将文本叠加到先前创建的pdf文档上
- 如何使用DateTimeFormatter解析非标准月份名称
- 如何使用MS Access等目录路径连接MySQL数据库文件(.sql)?
- 有一种简单的方法可以在Jhipster微服务网关上添加社交登录吗?