繁体   English   中英

如何从JTextField中读取System.in

[英]How can i make System.in read from a JTextField

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

我需要做的是,一旦用户在JTextField中输入一个包含String的字符串,就允许.read()继续。

问题是我不知道什么时候会调用.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();
    }
});

确保在两个字段中创建文本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM