2

私の友人と私は、キーボード/マウスのないタッチスクリーン端末用に作成された、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() に変更すると、カード データがコンソールに入力されるまで表示されません。わかりません笑。

4

2 に答える 2

0

I wrote a class that works in the console, but when run through the GUI it just hangs until I alt+tab and click inside the IDE's (Eclipse's) console and swipe the card.

これは、Eclipse 内でコードを実行していると思われます。IDE 内からコードを「テスト」する場合、Eclipse は基本的にコンソールをエミュレートします。そのため、IDE でコンソール ビューを使用する必要があります。

アプリケーションを通常どおり (つまり、IDE 内からではなく) 実行する場合、実際のコンソールは UI の背後で開いたままにする必要があります。Swing アプリの実行時にコンソールからの読み取りを個人的にテストしたことはありませんが、動作するはずです。

于 2012-01-17T19:39:26.493 に答える
0

私が読んだところによると、Java では、フォーカスされたウィンドウを除いて、入力のためにキーボードを直接監視することはネイティブに許可されていません。問題を解決できる方法が 2 つあります。1 つ目は、単純なキー リスナーをアプリケーションに追加し、入力をストリーミングして処理するだけです。2 つ目は、低レベルのキーボード フックを使用することです。

ここで似たようなことをしようとしている人との以前の議論がありました: Can Java see activity of my keyboard?

そこから、低レベルのフック実装でこの記事にたどり着くことができました: http://ksquared.de/blog/2011/07/java-global-system-hook/

于 2012-01-17T20:14:26.277 に答える