我正在寻找有关如何将System.in
替换为直接从InputStream
读取的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 :(得分: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;
}
}));
答案 1 :(得分:1)
你看中途,但是:
来自Javadocs
此方法阻塞,直到输入数据可用,结束 检测到流,或抛出异常。
http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InputStream.html#read%28%29
所以你的方法应该等待按下一个键。通过处理NoSuchElementException或KeyListener来检查有多少(新的?)字符可用。
此InputStream的语义与控制台的语义不同,因此您需要就如何处理编辑而不仅仅是按键进行一些设计决策。