【发布时间】:2015-11-15 05:23:51
【问题描述】:
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Listens for bar code input and puts it into a String Buffer.
*
*/
public class BarcodeReader {
private static final long THRESHOLD = 120;
private static final int MIN_BARCODE_LENGTH = 8;
public interface BarcodeListener
{
void onBarcodeRead(String barcode);
}
private final StringBuffer barcode = new StringBuffer();
private static final List<BarcodeListener> listeners = new CopyOnWriteArrayList<BarcodeListener>();
private long lastEventTimeStamp = 0L;
public BarcodeReader() {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e)
{
try
{
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;
}
catch (UnsupportedOperationException err)
{
throw new UnsupportedOperationException(err); //To change body of generated methods, choose Tools | Templates.
}
}
});
}
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);
}
}
实现代码如下:
private void startReading()
{
BarcodeReader reader = new BarcodeReader();
reader.addBarcodeListener(new BarcodeListener() {
public void onBarcodeRead(String barcode) {
System.out.println(barcode);
}
});
}
现在这个代码的问题是,当我扫描条形码时,它会返回多行相同的数据。因此我无法弄清楚发生了什么。迫切需要帮助。 提前感谢
【问题讨论】: