私の友人と私は、キーボード/マウスのないタッチスクリーン端末用に作成された、GUI を備えた Java でプログラムを作成しました。すべてが GUI 内で行われ、ほとんどの入力はボタンを押すことです。磁気カード リーダーを (キーボード モードで) 取り付けて、カードから読み取り、そのデータに基づいて処理を実行したいと考えています。
コンソールで動作するクラスを作成しましたが、GUI を実行すると、IDE の (Eclipse の) コンソール内で alt+tab キーを押してクリックし、カードをスワイプするまでハングします。私が探しているのは、GUI を離れることなくこの入力を取得する方法です。
MCR は、カード情報をキーボードで入力したかのように機能します。同じ行、txt ドキュメント、コンソールなどを入力できる場所ならどこでも、データの両方のトラックを含む行を送信します。
関連するコードは次のとおりです。
import java.util.Scanner;
public class CardRead {
public static void main()
{
String raw_card_data = "";
Scanner read = new Scanner( System.in );
System.out.println("Scan card"); // changed to an outputArea.setText for GUI
raw_card_data = read.nextLine(); // works in console, not within GUI
/* insert processing here */
}
}
GUI では、コードは次のようになります。
cardreadbtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
CardRead.main();
}
});
InputStream が機能するのではないかと思いましたが、実際にそれらを使用したことはありません。私はグーグルでこのスレッドを見つけました :次のように、IOUtilsに関する提案を統合しようとしました:
InputStream is = System.in;
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, null);
raw_card_data = writer.toString();
System.out.println(raw_card_data);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(writer);
私がそれを正しく行っているかどうかはわかりませんが、コンソール (GUI で試したことはありません) では、「カードのスキャン」と表示され、raw_card_data の出力やその他の処理に進むことはありません。ここから得た「closeQuetly」:
...しかし、繰り返しますが、私はそれを正しく行っているかどうかわかりません. Apache IOUtils も使用したことはありません。
だから私は立ち往生しています、そして私はあなたたちを探しています。GUIを離れずにこのカードデータを取得するにはどうすればよいですか?
重要な注意: カード データには可変のスペース (保持する必要がある) が含まれているため、 Scanner.next() のようなものは機能しません。カード リーダーは、両方のトラックがデリミタで区切られた行を送信し、次にキャリッジ リターンを送信するように設定されているため、.nextLine() は機能します。カードデータもバイト/文字の変数です。
また、最初のコード ブロックでは、System.out.println は、raw_card_data = read.nextLine() が実際に含まれる do while ループの前にあります (関連性がないと感じたので省略しましたが、今はその理由が気になります)これをやっている)。GUI で JTextArea に表示するために println を setText() に変更すると、カード データがコンソールに入力されるまで表示されません。わかりません笑。