2014-03-05 40 views
0

我正在构建一个基本销售点应用程序,我一直在寻找让我的主要POS JFrame侦听条形码输入的方​​法。我发现由Cyrusmith发布的这个代码(稍微修改),看起来像我想要的,但我不知道如何在我的JFrame中实现它。它看起来像是打算成为一个单独的课程,这就是我目前在我的项目中所拥有的。我问我的同事,他也不知道。使用外部类处理条形码扫描仪输入?

感谢您的帮助。

package barcode; 

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 = 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<>(); 
    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); 
    } 
} 

回答

2

大多数条形码阅读器基本上都是直接将代码注入键盘缓冲区。所以如果你有一个键盘焦点的JTextField,结果文本将被直接输入到它里面......没有魔法参与。

如果你“想”要使用本阅读器,那么你需要创建一个实例...

BarcodeReader reader = new BarcodeReader(); 

注册一个BarcodeListener它...

reader.addBarcodeListener(new BarcodeListener() { 
    public void onBarcodeRead(String barcode) { 
     // Respond to the event, like, I don't know, 
     // set the text of text field :P 
    } 
}); 

但对我来说,这只是看起来像很多额外的工作 - 但这只是我...

所以,是的,它假设是一个单独的类。根据您想要达到的目标,您可以将您当前的代码库中的某处(import)转储到您的源代码中,并像其他任何地方一样使用它。同样,你可以为它创建一个单独的库,但这只是意味着你需要将它包含在类路径中以编译和运行时执行以及...