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

标签 java multithreading swing jtextfield

我正在尝试使 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/

相关文章:

java - Spring Boot 共享线程

c# - 将两种形式作为不同的线程运行(或至少 2 种形式运行 "parallel")

java - TableModel.fireTableCellUpdated(tableRowIndex, tableColumnIndex) 没有更新 JTable 中的单元格

java - 在Java中获取音频文件的时间属性

java - 近似正则表达式等价

线程可以在接收到条件信号时唤醒但不能同时获得互斥锁

java - 更新Java中的arraylist方法

java - JTextArea - 只有数字

java - 使用 Intellij 和 Maven 调试 Java 注释处理器

java - 正则表达式中的 Unicode 脚本