我有一个条形码扫描仪,在我的java应用程序中,当使用条形码扫描产品时,我必须带一个弹出窗口显示与数据库条形码相关的所有信息。我没有关于应用程序的文本框我必须在内部处理这个部分。我该怎么做呢 ?有什么建议吗?我正在使用swing for UI。
修改
条形码扫描仪是USB扫描仪。如果我们扫描某些内容,它会将结果输出到具有焦点的文本框中。但是我没有在打开的页面上工作的文本框。我可以使用一些隐藏的文本框并在那里读取值吗?
答案 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;解决方案(现在有几个限制,但是你被邀请修复它们:))试图在这篇文章中解决以前解决方案的限制: