Java-如何扩展InputStream以从JTextField读取?

时间:2012-10-01 07:54:51

标签: java swing inputstream jtextfield

在项目上工作我通过类似控制台的小窗口运行java应用程序。感谢这里精彩的社区,我设法solve the problem with outputting the data from a proccess但我的命令行应用程序运行会不断出错,因为没有输入流。

根据该主题中的最后一个有用的回复,我想我将同样接近JTextFieldInputStream extends InputStream实现,但是查看javadocs以及整个谷歌和互联网上的某些类,我真的没有找到解释如何去做这个。

所以我要求一些链接,示例,教程,示例代码,就像上一个主题一样。 给我一个扩展InputStream的类,当我按Enter键时可以扩展为从JTextField读取,我将完成其余的工作并使其工作!提前谢谢!

2 个答案:

答案 0 :(得分:9)

我不明白为什么你需要一个扩展InputStream的JTextField?基本上,你在寻找的是:

  1. ActionListener上添加JTextField(即,当使用按 Enter 时,将调用actionPerformed
  2. 您需要使用text
  3. 获取JTextField的getText()
  4. 然后,您可以使用String text
  5. InputStream“转换”为new ByteArrayInputStream(text.getBytes("UTF-8"));

    这是一个小小片段,可以帮助您了解基本知识:

    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class TestTextField {
    
        private void initUI() {
            JFrame frame = new JFrame(TestTextField.class.getSimpleName());
            frame.setLayout(new FlowLayout());
            final JTextField textfield = new JTextField(20);
            textfield.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        String text = textfield.getText();
                        InputStream is = new ByteArrayInputStream(text.getBytes("UTF-8"));
                        // Here do something with your input stream (something non-blocking)
                        System.err.println(text);
                    } catch (UnsupportedEncodingException e1) {
                        e1.printStackTrace();
                    }
    
                }
            });
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(textfield);
            frame.setSize(300, 300);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new TestTextField().initUI();
                }
            });
        }
    
    }
    

答案 1 :(得分:2)

这个实现怎么样

import java.io.IOException;
import java.io.InputStream;

import javax.swing.JTextField;


public class JTextFieldInputStream extends InputStream {
    byte[] contents;
    int pointer = 0;

    public JTextFieldInputStream(final JTextField text) {

        text.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                if(e.getKeyChar()=='\n'){
                    contents = text.getText().getBytes();
                    pointer = 0;
                    text.setText("");
                }
                super.keyReleased(e);
            }
        });
    }

    @Override
    public int read() throws IOException {
        if(pointer >= contents.length) return -1;
        return this.contents[pointer++];
    }

}

要使用此输入流,请执行以下操作

 InputStream in = new JTextFieldInputStream( someTextField );
 char c;
 while( (c = in.read()) != -1){
    //do whatever with c
 }
  

只有当我点击进入时它才能读取吗?

当你致电in.read()时,如果返回值-1表示流的结尾

,则会显示
  

(并且我能够修改以便Enter键清空JTextField吗?)

您需要添加一个动作侦听器,此功能与输入流

的作业无关