Java 使用外部类处理条形码扫描仪输入?
我正在构建一个基本的销售点应用程序,我一直在寻找让我的主POS JFrame监听条形码输入的方法。我发现了Cyrusmith发布的这段代码(稍加修改),它看起来像我想要的,但我不知道如何在我的JFrame中实现它。它看起来像是一个单独的类,这就是我目前在项目中使用它的方式。我问我的同事,他也不知道 谢谢你的帮助Java 使用外部类处理条形码扫描仪输入?,java,swing,netbeans,barcode-scanner,keyboardfocusmanager,Java,Swing,Netbeans,Barcode Scanner,Keyboardfocusmanager,我正在构建一个基本的销售点应用程序,我一直在寻找让我的主POS JFrame监听条形码输入的方法。我发现了Cyrusmith发布的这段代码(稍加修改),它看起来像我想要的,但我不知道如何在我的JFrame中实现它。它看起来像是一个单独的类,这就是我目前在项目中使用它的方式。我问我的同事,他也不知道 谢谢你的帮助 package barcode; import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; i
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);
}
}
包装条码;
导入java.awt.KeyEventDispatcher;
导入java.awt.KeyboardFocusManager;
导入java.awt.event.KeyEvent;
导入java.util.List;
导入java.util.concurrent.CopyOnWriteArrayList;
/**
*侦听条形码输入并将其放入字符串缓冲区。
*
*/
公共类条形码阅读器{
私有静态最终长阈值=100;
专用静态最终整数最小条形码长度=8;
公共接口条形码侦听器{
无效onBarcodeRead(字符串条形码);
}
私有最终StringBuffer条形码=新StringBuffer();
private final List listeners=new CopyOnWriteArrayList();
私有长lastEventTimeStamp=0L;
公共条形码阅读器(){
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(新的KeyEventDispatcher()){
@凌驾
公共布尔dispatchKeyEvent(KeyEvent e){
试一试{
如果(e.getID()!=KeyEvent.KEY_已释放){
返回false;
}
if(例如getWhen()-lastEventTimeStamp>THRESHOLD){
条形码.删除(0,条形码.长度());
}
lastEventTimeStamp=e.getWhen();
如果(例如getKeyCode()==KeyEvent.VK_ENTER){
if(barcode.length()>=最小条形码长度){
fireBarcode(barcode.toString());
}
条形码.删除(0,条形码.长度());
}否则{
条形码.append(例如getKeyChar());
}
返回false;
}捕获(不支持操作异常错误){
抛出新的UnsupportedOperationException(err);//若要更改生成的方法体,请选择工具|模板。
}
}
});
}
受保护的无效fireBarcode(字符串条形码){
for(条形码侦听器侦听器:侦听器){
onBarcodeRead(条形码);
}
}
public void addBarcodeListener(BarcodeListener侦听器){
添加(侦听器);
}
公共void removeBarcodeListener(BarcodeListener listener){
删除(侦听器);
}
}
大多数条形码阅读器基本上是将代码直接注入键盘缓冲区。因此,如果您有一个具有键盘焦点的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
将该类导入到源代码中,并像其他任何类一样使用它。同样,您可以为它创建一个单独的库,但这只意味着您需要将它包含在类路径中,以便进行编译和运行时执行