【问题标题】:Java: need to get input line while in a GUI, is only working in consoleJava:需要在 GUI 中获取输入行,仅在控制台中工作
【发布时间】: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


    【解决方案1】:

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

    之前有人在这里讨论过尝试做类似的事情: Can Java see activity of my keyboard?

    从那里我能够通过低级挂钩实现获得这篇文章:http://ksquared.de/blog/2011/07/java-global-system-hook/

    【讨论】:

    • 谢谢老兄。我可能会使用键盘挂钩,但我需要一些帮助来实现它。我会环顾四周,也许会发布另一个问题。
    【解决方案2】:

    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 应用程序时,我没有亲自测试从控制台读取,但它应该可以工作。

    【讨论】:

    • 我在 Eclipse 中运行代码。我将它导出到一个可运行的 .jar 中,它后面运行着一个真正的控制台,但问题是一样的。当焦点在 GUI 上时,它会在卡片入口处挂起。我必须 alt+tab 到控制台并刷卡,就像从 Eclipse 测试时一样。不过感谢您的快速回复:)
    • 您仍然需要切换到真正的控制台才能输入信息,因为 System.in 正在使用来自控制台的标准输入流。一种破解方法可能是向您的应用程序添加某种关键侦听器,因此它不需要更改焦点。否则你需要一个直接来自键盘的输入流,我想。
    • 对,我原来误解了这个问题。我正在想一个更好的方法,以便我可以编辑我的答案。
    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2015-09-24
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多