【发布时间】:2012-01-17 19:31:59
【问题描述】:
我和我的朋友们用 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 可能会起作用,但我从未真正使用过它们。我用谷歌搜索并找到了这个 thread: 我尝试整合关于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 或执行其他任何操作。我从here:得到的“closeQuietly”
...不过,我不知道我做得对不对。也从未使用过 apache IOUtils。
所以我被困住了,我正在寻找你们。如何在不离开 GUI 的情况下获取此卡数据?
重要提示:卡片数据中有一个可变的#个空格(我们需要保留),所以像 Scanner.next() 这样的任何东西都不起作用。读卡器设置为发送一行,其中两个轨道由分隔符分隔,然后是回车,因此 .nextLine() 有效。卡片数据也是字节/字符的变量。
另外:在第一个代码块中,System.out.println 在 do while 循环之前 raw_card_data = read.nextLine() 实际上在其中(我把它省略了,因为我觉得它不相关,但现在我'我很好奇它为什么这样做)。当 println 更改为 setText() 以在 GUI 中显示到 JTextArea 时,它直到在控制台中输入卡片数据之后才会显示,即使它发生在 do while 之前并且应该在它之前执行。没看懂,呵呵。
【问题讨论】:
标签: java user-interface input java.util.scanner magnetic-cards