2

我和我的朋友们用 Java 编写了一个带有 GUI 的程序,专为没有键盘/鼠标的触摸屏终端而设计。一切都发生在 GUI 中,大部分输入都是按钮按下。我们想连接一个磁卡读卡器(在键盘模式下)并从卡中读取,然后根据其中的数据执行处理。

我编写了一个在控制台中工作的类,但是当通过 GUI 运行时,它只是挂起,直到我 alt+tab 并在 IDE(Eclipse 的)控制台内单击并刷卡。我正在寻找的是一种无需离开 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 或执行其他任何操作。“closeQuietly”我从这里得到:

...但同样,我不知道我是否做得对。也从未使用过 apache IOUtils。

所以我被困住了,我期待着你们。如何在不离开 GUI 的情况下获取此卡数据?

重要提示:卡片数据中有一个可变的空格数(我们需要保留),所以像 Scanner.next() 这样的任何东西都不起作用。读卡器设置为发送一行,其中两个轨道由分隔符分隔,然后是回车,因此 .nextLine() 有效。卡数据也是字节/字符的变量#。

另外:在第一个代码块中, System.out.println 在 do while 循环之前 raw_card_data = read.nextLine() 实际上在(我把它省略了,因为我觉得它不相关,但现在我很好奇为什么它正在这样做)。当 println 更改为 setText() 以在 GUI 中显示到 JTextArea 时,它直到在控制台中输入卡片数据之后才会显示,即使它发生在 do while 之前并且应该在它之前执行。没看懂,呵呵。

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 本身不允许您直接监视键盘的输入,但焦点窗口除外。我可以看到两种方法可以解决您的问题。第一种是向您的应用程序添加一个简单的键侦听器,然后只对输入进行流式传输并对其进行处理。第二种是使用低级键盘挂钩。

There was a previous discussion with someone trying to do something similar here: Can Java see activity of my keyboard?

and from there I was able to get to this article with a low level hook implementation: http://ksquared.de/blog/2011/07/java-global-system-hook/

于 2012-01-17T20:14:26.277 回答