4

プロジェクトに取り組んでいると、コンソールのような小さなウィンドウからJavaアプリケーションを実行できるようになりました。ここの素晴らしいコミュニティのおかげで、プロセスからデータを出力する際の問題を解決できましたが、実行中のコマンドラインアプリケーションでは、入力ストリームがないため、常にエラーが発生します。

そのスレッドの最後の有益な回答に基づいて、私は同様にJTextFieldInputStream extends InputStream実装にアプローチすると思いますが、javadocsとグーグルとインターネット全体でそれを行うクラスを探して、これを行う方法を説明するものは何も見つかりませんでした。

そのため、前のトピックと同じように、リンク、例、チュートリアル、サンプルコードを求めています。InputStreamを拡張し、Enterキーを押すと、JTextFieldから読み取るように拡張できるクラスを教えてください。残りは、これを実装して機能させることで行います。前もって感謝します!

4

2 に答える 2

9

InputStreamを拡張するJTextFieldが必要な理由がわかりません。基本的に、あなたが探しているのは:

  1. にを追加ActionListenerしますJTextField(つまり、を使用するEnteractionPerformedが呼び出されます)
  2. textを使用してJTextFieldを取得する必要がありますgetText()
  3. String text次に、をで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();
            }
        });
    }

}
于 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
 }

Enterキーを押したときにのみ読み取られますか?

in.read()呼び出し時に、戻り値-1がストリームの終了を意味する場合に読み取ります

(そして、EnterキーがJTextFieldを空にするように変更することはできますか?)

アクションリスナーを追加する必要があり、この機能は入力ストリームのジョブとは何の関係もありません

于 2012-10-01T08:03:51.627 に答える