2012-06-08 35 views
2

我正在寻找有关如何将System.in替换为InputStream的说明,该文件直接从JTextField中读取。将System.in设置为从JTextField读取

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

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在尝试当输入是空的,我以为永远无法找到一个分隔符来阅读。

我错过了什么方法?

+0

为什么不使用'KeyListener'来检测每个键入的类型? – evanwong

+0

@evanwong你可以建议如何绑定到输入流? – Jivings

回答

3

嗯,这是我用来让它正常工作的方法。如果任何人都可以改善这个答案,然后感到自由

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;   
    } 
})); 
+0

您做出了不同于规格说明的语义判定。而你没有遵守封锁合同。并返回0 //现在没有什么可以返回的,这只是我眼中的一个糟糕的决定。 –

+0

Ctrl-V怎么样? –

+0

@CaptainGiraffe我已经改进了我的回答。 – Jivings

1

你看一半了,但是:

从的Javadoc

此方法一直阻塞在输入数据可用,检测 流的末尾或者抛出异常。

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

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

此InputStream的语义不同于控制台,因此您需要就如何处理编辑而不仅仅是按键做出设计决定。

+0

所以我应该抓住那个例外? – Jivings

+0

@Jivings是的,而不是从方法返回。有数据时返回。 –

+0

它看起来像我应该返回0时,因为该方法应该返回有多少字节已被读取。 – Jivings