
はじめまして、表題の質問をさせていただきます。
現在とある機械を管理するプログラムを作成しています。(JDK1.6)
分かりづらいので例えるならば図書館でやっている本の登録、貸出みたいなことです。
そこで質問なのですが、本に貼ってあるバーコードを読んだときにそれが手入力なのかバーコードリーダーから読まれたデータなのかを判別する手段はあるのですが?
(不正防止のため手入力は一部の管理者のみ認め、一般ユーザーはバーコードのみとしています)
JTextFieldのKeyReleaseイベントだと1文字づつイベントが発生し、ActionPerformedだと1度だけイベントが発生することが分かったのですがそれを組み合わせても判断はできないと思います。
また、JFrameのKeyReleasedイベントで取得してJTextFieldにセットすることを考えたのですが、配下の全コンポーネントのfocusableをfalseにセットしないとJFrameのKeyReleasedイベントが発生しないし、やはりJFrame上でも手入力とバーコードリーダーの判断がつきません。
何か解決策があればご教授願います。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>孫コンポーネントの件。
再帰呼び出しを使用します。
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さん、回答ありがとうございます。
バーコードの件は一応解決しましたが、上記のフォーカス制御はどこでも使う機能なので助かりました。
実装して正しく制御されている確認をしました。
呼び出しは以下です。
// フレーム全体のとき
setComponetFoucs((javax.swing.JComponent)this.getContentPane());
// パネル指定のとき
setComponetFoucs((javax.swing.JComponent)jPanel51);
>私がこの処理を実装する場合はKeyboardFocusManagerとKeyEventPostProcessorを使用します。
>興味があるなら上記単語で検索してみてください。
初めて聞きました、後で検索してみます。
どうもありがとうございました。
No.2
- 回答日時:
まず原則としてメーカーの人にデータ仕様を聞いたほうがいいと思われます。
Javaではありませんが、昔似たようなシステムを作ったときには
リーダーからスキャンしたときはバーコードの後に改行コードが付いていたのでそれで手入力かどうかの判断をしていました。
この回答への補足
>まず原則としてメーカーの人にデータ仕様を聞いたほうがいいと思われます。
メーカーに問い合わせたところ、バーコードリーダーごとに付加情報が設定できることが分かりました。(前後)
例えば後に任意の文字"QQQQQ"とかを付加した場合、リーダーで読むと1234567QQQQQという具合になるそうです。QQQQQの文字が使用者に分からなければ一応手入力かバーコード入力かの判別がつきそうです。
おっしゃるとおり、製作元に聞くのが一番のようですね。ありがとうございました。
回答ありがとうございます。
>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;
}
No.1
- 回答日時:
バーコードリーダーはキーボートのコネクタに、キーボードと差し替えて使う(もしくはキーボードとのあいだに挟む)タイプのもの、なのでしょうね。
プログラム側でバーコードリーダーの存在を意識しなくて済むように開発されたものですから基本的に区別する方法はありません。
Key~イベントが極めて短時間に連続して発生したときは機械的に入力された、と判断することができるかもしれませんが、驚異的な速度で入力できる人間がいないとも限らないので無理な気がします。
バーコード自体、印刷するプログラムを入手して簡単に偽造できるのですが、手入力かどうかが不正の判断材料になるのでしょうか。
印刷したバーコードを隠し持ってて読み取らせるほうが見付かり難いと思いますが。
#読み取ったときに「ピッ」と鳴るから分かる?
回答ありがとうございます。
バーコードリーダーはUSB接続のタイプです。
KeyReleaseイベントが最初に発生した時間からActionPerformedが発生した時間を計測してn秒以下ならからバーコード入力だと判断するしかなさそうです。
>印刷したバーコードを隠し持ってて読み取らせるほうが見付かり難いと思いますが。
>#読み取ったときに「ピッ」と鳴るから分かる?
バーコードは各部署でもっておりそのあたりが難しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Excel(エクセル) excelvbaのenableeventsについて 3 2022/08/30 11:20
- 大学受験 大学の志望理由の添削をお願いします! 私は将来起業をしたいと考えております。 そのため貴学の商学 部 7 2022/09/17 14:45
- その他(データベース) 4進数風なバーコードは何ですか? 2 2022/11/28 23:33
- 哲学 大学で哲学の講義を履修しているのですが、さっぱり内容が分かりません。真面目に講義は受けているつもりで 1 2022/05/28 18:16
- ダイエット・食事制限 レコーディングダイエットをしてる方に質問です。 「あすけん」というアプリを使用してるのですが、食べた 7 2023/05/26 19:25
- 政治 統一教会や創価学会等のカルトの犯罪や搾取やJL等の詐欺集団の詐欺等に加担してきたのも 2 2022/08/07 09:53
- デジタルカメラ 写真撮影可能なバーコードリーダーを探しています 2 2022/05/26 17:15
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
jsp 改行コードで改行させて表...
-
VBA初心者です。txtファイルの...
-
LaTeX: captionの中で改行した...
-
エスケープ文字の復帰(¥r)と...
-
タグの中の改行文字を正規表現...
-
変数に格納している文字列の読...
-
PHPで出力したHTMLのソースが汚い
-
ファイル入出力について教えて...
-
最終行の改行について
-
[iPhone]改行をファイル出力す...
-
VC++のボタン
-
Excel VBS、ADODB.Streamで改行
-
改行について
-
FORTRANで作成したテキストファ...
-
JavaDoc コメントの改行について
-
ファイルから読み取った改行文...
-
itextで改行するには
-
ソースコードの1行が長いとき...
-
CSV出力時の改行コードについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
改行について
-
エクセルVBA 文字列領域が不足...
-
最終行の改行について
-
テキストボックス行の桁数を制...
-
【VBA】エクセルで最後の不要な...
-
awkで改行を除いて文字列を抜き...
-
グレープシティのSPREAD...
-
VBAでCSVをExcelに取り込む時に...
-
秀丸の正規表現で複数行にわた...
-
C# DataGridViewのセルを改行禁...
-
JavaMail,本文中の改行について
-
テキストファイルから改行コー...
-
vb.netでのリッチテキストボッ...
-
ラベル(スタティックテキスト)...
-
jsp 改行コードで改行させて表...
-
COBOLの改行
-
文字列型変数に1024を超えた文...
おすすめ情報