我和我的朋友们用 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 之前并且应该在它之前执行。没看懂,呵呵。