4

在做一个项目时,我通过一个类似控制台的小窗口开始运行 java 应用程序。感谢这里的精彩社区,我设法解决了从进程中输出数据的问题,但是由于没有输入流,我运行的命令行应用程序会不断出错。

基于该线程中最后一个有用的回复,我想我将采用类似的方法来JTextFieldInputStream extends InputStream实现,但是在 javadocs 以及整个谷歌和互联网中寻找一些可以做到这一点的类,我真的没有发现任何解释如何做到这一点。

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

4

2 回答 2

9

如果您需要扩展 InputStream 的 JTextField,我不明白什么?基本上,您正在寻找的是:

  1. 添加一个ActionListeneron JTextField(即,当使用 presses 时EnteractionPerformed将被调用)
  2. 您需要text使用 JTextField获取getText()
  3. 然后,您可以将“转换”String textInputStreamwithnew 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();
            }
        });
    }

}
于 2012-10-01T08:12:42.163 回答
3

这个实现怎么样

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?)

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

于 2012-10-01T08:03:51.627 回答