Java 在没有文本框的情况下从内部条形码扫描仪获取输入

Java 在没有文本框的情况下从内部条形码扫描仪获取输入,java,swing,Java,Swing,我有一个条形码扫描仪,在我的java应用程序中,当使用条形码扫描产品时,我必须打开一个弹出窗口来显示数据库中与条形码相关的所有信息。我在应用程序上没有文本框,我必须在内部处理这个部分。我该怎么做?有什么建议吗?我正在使用swing作为UI 编辑 条形码扫描器是USB的。如果我们扫描某个东西,它会将结果输出到有焦点的文本框中。但是我在打开的页面上没有文本框。我可以使用一些隐藏的文本框并读取其中的值吗?因为条形码扫描器只是一个发送键码并在读取每个条形码后输入的设备,所以我会使用键侦听器 final

我有一个条形码扫描仪,在我的java应用程序中,当使用条形码扫描产品时,我必须打开一个弹出窗口来显示数据库中与条形码相关的所有信息。我在应用程序上没有文本框,我必须在内部处理这个部分。我该怎么做?有什么建议吗?我正在使用swing作为UI

编辑


条形码扫描器是USB的。如果我们扫描某个东西,它会将结果输出到有焦点的文本框中。但是我在打开的页面上没有文本框。我可以使用一些隐藏的文本框并读取其中的值吗?

因为条形码扫描器只是一个发送键码并在读取每个条形码后输入的设备,所以我会使用键侦听器

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

}
公共类条形码阅读器{
私有静态最终长阈值=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;
}
});
}
受保护的无效fireBarcode(字符串条形码){
for(条形码侦听器侦听器:侦听器){
onBarcodeRead(条形码);
}
}
public void addBarcodeListener(BarcodeListener侦听器){
添加(侦听器);
}
公共void removeBarcodeListener(BarcodeListener listener){
删除(侦听器);
}
}

以某种类似于@Cyrusmith solution的方式,我创建了一个“概念验证”解决方案(目前有几个限制,但请您修复它们:))试图解决本文中以前解决方案的限制:

  • 它支持不在条形码字符串末尾发送输入的条形码阅读器
  • 如果焦点当前在swing文本组件上,并且捕获了条形码,则条形码不会到达文本组件,而仅到达条形码侦听器

请参见

我不确定你在问什么(否决票不是我的)。肯定需要更多的细节。条形码扫描仪是应用程序的一部分还是第三方独立应用程序的一部分?您需要文本框字段做什么?条形码扫描器如何与应用程序通信?通常,条形码扫描器是普通的HID设备,其工作原理类似于键盘-向任何有焦点的窗口发送击键。您可以尝试在应用程序中捕获击键。是的,我可以获取击键,但在我将焦点转移到文本字段之前,如何通知应用程序击键已开始发生?\n扫描仪输出中可能捕获的数据类型(图像、字节、流…)是什么,API或驱动程序必须说明这一点。这一个的问题是,用户只需用键盘按一些键,然后按ENTER键,应用程序就会将其作为捕获的条形码。此外,并不是每个条形码阅读器都发送ENTER键后缀。这是一个很好的解决方案,但有些条形码阅读器默认情况下不发送ENTER键后缀。如果最后不发送ENTER键,我看不到用您的代码捕获条形码的方法