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

我有一个条形码扫描仪,在我的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