gpt4 book ai didi

java - 如何让 System.in 从 JTextField 中读取

转载 作者:行者123 更新时间:2023-12-02 04:43:38 25 4
gpt4 key购买 nike

我正在尝试使 System.in InputStream 从 JTextField 中读取。

我需要它做的是允许 .read() 在用户按下带有字符串的 JTextField 中的 enter 后继续。

问题是我不知道什么时候调用 .read(),我希望它在不卡住主线程的情况下阻塞,直到用户在 JTextField 中按下 enter 键,它会通知正在等待的线程.

到目前为止,我尝试了以下方法:

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. InputStream处理线程(见上^)
3.读取System.in的线程

问题是,一旦我调用 inputStreamHandler.notify();,它就会抛出一个 java.lang.IllegalMonitorStateException,根据文档,如果线程是不是锁的持有人。我该如何解决?

谢谢 :-)

最佳答案

String text;

...

in.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
text = in.getText();
}
});

确保在两个字段中都输入文本。

关于java - 如何让 System.in 从 JTextField 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35208993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com