如何从JTextField

时间:2016-02-04 18:38:47

标签: java multithreading swing jtextfield

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

我需要它做的是,一旦用户在JTextField中按Enter键,允许.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,根据文档,如果该线程不是锁的持有者,则抛出该$ sudo -u hdfs hadoop dfsadmin -report DEPRECATED: Use of this script to execute hdfs command is deprecated. Instead use the hdfs command for it. 。 我该如何解决这个问题?

谢谢:-)

1 个答案:

答案 0 :(得分:0)

String text;

...

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

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