我正在尝试让System.in InputStream从JTextField中读取内容。
我需要它能够允许.read()
在用户在JTextField中输入字符串并按下回车后继续执行。
问题是我不知道何时调用.read(),我希望它能够阻塞线程但不会冻结主线程,直到用户在JTextField中按下回车,然后它将通知等待的线程。
到目前为止,我尝试了以下方法:
public class InputStreamHandlerThread extends Thread {
private JTextField txt;
public InputStreamHandlerThread(JTextField txt) {
this.txt = txt;
start();
}
@Override
public void run() {
System.setIn(new FakeInputStream());
}
class FakeInputStream extends InputStream {
private int indx = 0;
@Override
public int read() throws IOException {
if (indx == txt.getText().length()) {
indx = 0;
try {
synchronized (this) {
wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int byt = txt.getText().getBytes()[indx];
indx++;
return byt;
}
}
}
这个类由GUI线程初始化并启动。一旦GUI加载完成,它就创建了这个类的一个实例,并保留一个指针,以便在JTextField中按下键盘上的回车键时通知它读取其中的内容。
in = new JTextField();
in.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent a) {
if (a.getKeyChar() == '\n') {
inputStreamHandler.notify();
}
}
});
目前有三个线程:
1. 运行GUI的主线程
2. 输入流处理程序线程(见上文^)
3. 从System.in读取的线程 问题在于,一旦我调用
inputStreamHandler.notify();
,它会抛出一个 java.lang.IllegalMonitorStateException
异常,根据文档,如果线程不是锁的持有者,则抛出此异常。如何解决这个问题呢?谢谢 :-)
System.in
从JTextField
中读取?此外,您是希望流在每次键入时都进行读取,还是只有在用户按下Enter键时才读取? - user1803551