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

1 回答 1

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的某个位置、该类转储到您的源代码中,并像其他任何地方一样使用它。同样,您可以为它创建一个单独的库,但这只是意味着您需要将它包含在类路径中以进行编译和运行时执行......

于 2014-03-06T00:11:02.593 回答