【问题标题】:Setting System.in to read from JTextField将 System.in 设置为从 JTextField 读取
【发布时间】:2012-06-12 15:31:39
【问题描述】:

我正在寻找有关如何将System.in 替换为直接从JTextField 读取的InputStream 的方向。

到目前为止,我的方法几乎都是反复试验。我目前有;

JTextField input = new JTextField();

System.setIn(new InputStream() {
  int ptr = 0;
  @Override
  public int read() throws IOException {
     int c;
     try {
        c = input.getText().charAt(ptr);
     }
     catch (IndexOutOfBoundsException ioob) {
        return 0;
     }
     ptr++;
     return c;
  }
});

这会产生一个NoSuchElementException,因为当输入为空并且我假设永远找不到分隔符时尝试读取。

我缺少什么方法?

【问题讨论】:

  • 为什么不直接使用KeyListener 来检测每个键入的键?
  • @evanwong 你能建议如何将它绑定到输入流吗?

标签: java input inputstream system.in


【解决方案1】:

嗯,这是我用来让它正常工作的方法。如果有人可以改进此答案,请随意。

final LinkedBlockingQueue<Character> sb = new LinkedBlockingQueue<Character>();

final JTextField t = new JTextField();
t.addKeyListener(new KeyListener() {
  @Override
  public void keyTyped(KeyEvent e) {
    sb.offer(e.getKeyChar());
  }
  ...
});

System.setIn(new BufferedInputStream(new InputStream() {
  @Override
  public int read() throws IOException {
    int c = -1;
    try {
      c = sb.take();            
    } catch(InterruptedException ie) {
    } 
    return c;           
  }
}));

【讨论】:

  • 您做出的语义决定与规格说明的不同。而且你没有遵守阻塞合同。并且 return 0 // 现在什么都不返回,在我看来只是一个糟糕的决定。
  • @CaptainGiraffe 我已经改进了我的回答。
  • @CaptainGiraffe 我的 0 假设不正确。道歉。
  • 道歉不是必需的,但您仍然需要考虑剪切/粘贴方案。你也可以自己做 LBQ =) 不是有一个 onChangeListener 来为你简化事情吗?
  • @CaptainGiraffe 一个 on change 监听器可能会更好!我会测试和编辑。我也确实先做了一些关于锁定的事情,然后我才想起了 LBQ =)
【解决方案2】:

你看了一半,但是:

来自 Javadocs

此方法阻塞,直到输入数据可用,结束 检测到流,或抛出异常。

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InputStream.html#read%28%29

所以你的方法应该只是等待一个键被按下。通过处理 NoSuchElementException 或检查有多少(新?)字符可用的 KeyListener。

这个 InputStream 的语义与控制台不同,因此您需要对如何处理编辑做出一些设计决策,而不仅仅是按键。

【讨论】:

  • 所以我应该只是捕捉到那个异常?
  • @Jivings 是的,并且不会从方法中返回。有数据时返回。
  • 在我看来,当出现异常时我应该返回 0,因为该方法应该返回已读取的字节数。
  • @Jivings 你的例外不是没有数据,没有数据也不例外。不要回来。
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多