0

私は基本的な POS アプリケーションを構築しており、メインの POS JFrame がバーコード入力をリッスンする方法を探していました。Cyrusmith によって投稿されたこのコード (わずかに変更された) を見つけました。別のクラスになることを意図しているように見えます。これが、現在私のプロジェクトで使用している方法です。同僚に聞いたのですが、彼も知りません。

ご協力いただきありがとうございます。

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 に答える