- 締切済み
バーコード入力と手入力の判断はつくのでしょうか?
はじめまして、表題の質問をさせていただきます。 現在とある機械を管理するプログラムを作成しています。(JDK1.6) 分かりづらいので例えるならば図書館でやっている本の登録、貸出みたいなことです。 そこで質問なのですが、本に貼ってあるバーコードを読んだときにそれが手入力なのかバーコードリーダーから読まれたデータなのかを判別する手段はあるのですが? (不正防止のため手入力は一部の管理者のみ認め、一般ユーザーはバーコードのみとしています) JTextFieldのKeyReleaseイベントだと1文字づつイベントが発生し、ActionPerformedだと1度だけイベントが発生することが分かったのですがそれを組み合わせても判断はできないと思います。 また、JFrameのKeyReleasedイベントで取得してJTextFieldにセットすることを考えたのですが、配下の全コンポーネントのfocusableをfalseにセットしないとJFrameのKeyReleasedイベントが発生しないし、やはりJFrame上でも手入力とバーコードリーダーの判断がつきません。 何か解決策があればご教授願います。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- nfonfonfo
- ベストアンサー率63% (12/19)
>孫コンポーネントの件。 再帰呼び出しを使用します。 public void setComponetFoucs(JComponent comp){ for(int i=0;i<comp.getComponentCount();i++){ if (comp.getComponent(i) instanceof JComponent){ JComponent c = (JComponent)comp.getComponent(i); c.setFocusable(false); if (c.getComponentCount() > 0){ setComponetFoucs(c); } } } } 呼び出しかた setComponetFoucs((JComponent)new JFrame().getContentPane()); 以下は補足事項的なことです。 1、最初の質問事項として下記引用文のことを書いておいたほうがレスが付きやすいと思います。 >バーコードリーダーは最後に改行コードがつきます。 >但しキーボードで改行を入力したときも同じような動きになってしまいます。 >よってとりあえず、JFrameで受け取るようにします。 2、>JFrameにKeyReleasedイベントを受ける 私がこの処理を実装する場合はKeyboardFocusManagerとKeyEventPostProcessorを使用します。 興味があるなら上記単語で検索してみてください。
- nfonfonfo
- ベストアンサー率63% (12/19)
まず原則としてメーカーの人にデータ仕様を聞いたほうがいいと思われます。 Javaではありませんが、昔似たようなシステムを作ったときには リーダーからスキャンしたときはバーコードの後に改行コードが付いていたのでそれで手入力かどうかの判断をしていました。
お礼
回答ありがとうございます。 >Javaではありませんが、昔似たようなシステムを作ったときには リーダーからスキャンしたときはバーコードの後に改行コードが付いて >いたのでそれで手入力かどうかの判断をしていました。 バーコードリーダーは最後に改行コードがつきます。 但しキーボードで改行を入力したときも同じような動きになってしまいます。 よってとりあえず、JFrameで受け取るようにします。 そこで追加の質問です。 実験の結果JFrameにKeyReleasedイベントを発生させるには配下のコンポーネント全てのFocusableをfalseにセットする必要があります。(Label以外) 以下の場合、コンポーネントの子供はいいけど孫が取得できないのです。実際のFormは階層が深くコンポーネントの数も多いのでメンテナンスを考慮して以下のようにしたのですが、孫がうまくいきません。 一番いいのはJFrameを指定すればその配下の全コンポーネントを取得して一気にFocusableを制御することができれば助かります。 よろしくお願いいたします。 public boolean ctlMyComponentFocus(javax.swing.JComponent pComponent, boolean pVal) { // コンポーネント配下のフォーカス制御する for (int i = 0; i < pComponent.getComponentCount(); i++) { javax.swing.JComponent childCompo = (javax.swing.JComponent)pComponent.getComponent(i); pComponent.getComponent(i).setFocusable(pVal); } return true; }
補足
>まず原則としてメーカーの人にデータ仕様を聞いたほうがいいと思われます。 メーカーに問い合わせたところ、バーコードリーダーごとに付加情報が設定できることが分かりました。(前後) 例えば後に任意の文字"QQQQQ"とかを付加した場合、リーダーで読むと1234567QQQQQという具合になるそうです。QQQQQの文字が使用者に分からなければ一応手入力かバーコード入力かの判別がつきそうです。 おっしゃるとおり、製作元に聞くのが一番のようですね。ありがとうございました。
- isle
- ベストアンサー率51% (77/150)
バーコードリーダーはキーボートのコネクタに、キーボードと差し替えて使う(もしくはキーボードとのあいだに挟む)タイプのもの、なのでしょうね。 プログラム側でバーコードリーダーの存在を意識しなくて済むように開発されたものですから基本的に区別する方法はありません。 Key~イベントが極めて短時間に連続して発生したときは機械的に入力された、と判断することができるかもしれませんが、驚異的な速度で入力できる人間がいないとも限らないので無理な気がします。 バーコード自体、印刷するプログラムを入手して簡単に偽造できるのですが、手入力かどうかが不正の判断材料になるのでしょうか。 印刷したバーコードを隠し持ってて読み取らせるほうが見付かり難いと思いますが。 #読み取ったときに「ピッ」と鳴るから分かる?
お礼
回答ありがとうございます。 バーコードリーダーはUSB接続のタイプです。 KeyReleaseイベントが最初に発生した時間からActionPerformedが発生した時間を計測してn秒以下ならからバーコード入力だと判断するしかなさそうです。 >印刷したバーコードを隠し持ってて読み取らせるほうが見付かり難いと思いますが。 >#読み取ったときに「ピッ」と鳴るから分かる? バーコードは各部署でもっておりそのあたりが難しいです。
お礼
nfonfonfoさん、回答ありがとうございます。 バーコードの件は一応解決しましたが、上記のフォーカス制御はどこでも使う機能なので助かりました。 実装して正しく制御されている確認をしました。 呼び出しは以下です。 // フレーム全体のとき setComponetFoucs((javax.swing.JComponent)this.getContentPane()); // パネル指定のとき setComponetFoucs((javax.swing.JComponent)jPanel51); >私がこの処理を実装する場合はKeyboardFocusManagerとKeyEventPostProcessorを使用します。 >興味があるなら上記単語で検索してみてください。 初めて聞きました、後で検索してみます。 どうもありがとうございました。