1

文字を PipedInputStream に書き込むために使用する BufferedWriter があります。キーボード イベントに基づきます。しかし、私はバックスペース ハンドラーを実装していますが、unputc なしではそうする方法がわかりません。

現在の行をバッファリングするために文字列を使用することにほとんど陥っています。

おそらく、代わりに Canvas を使用すると、より良い仕事ができるでしょう。(神よ、私はJavaが嫌いです!)

public class Console extends JTextArea {
    /**
     * 
     */
    private static final long serialVersionUID = 6315506875930497268L;
    private PipedInputStream stdin;
    private PipedOutputStream stdout;
    private PipedOutputStream stderr;
    private boolean bounceKey = true;

    private class Dispatcher implements Runnable {
        InputStream in;

        public Dispatcher(InputStream in) {
            this.in = in;
        }

        @Override
        public void run() {
            Reader input = new BufferedReader(new InputStreamReader(in));
            int c;
            try {
                try {
                    while ((c = input.read()) >= 0) {
                        append(String.valueOf((char) c));
                    }
                } finally {
                    input.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public Console() throws IOException {
        stdin = new PipedInputStream();
        stdout = new PipedOutputStream();
        stderr = new PipedOutputStream();
        final Writer kbd = new BufferedWriter(new OutputStreamWriter(
                new PipedOutputStream(stdin)));

        new Thread(new Dispatcher(new PipedInputStream(stdout))).start();
        new Thread(new Dispatcher(new PipedInputStream(stderr))).start();

        addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                try {
                    char ch = e.getKeyChar();
                    kbd.write(ch);
                    append(String.valueOf(ch));
                    if(ch == '\n') kbd.flush();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
                int keycode = e.getKeyCode();
                switch(keycode) {
                case KeyEvent.VK_BACK_SPACE:
                    // Erase the last char from buffer and the screen
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
            } // DONOTHING
        });

        setEditable(false);
        setFocusable(true);
        setBackground(Color.black);
        setForeground(Color.lightGray);
        setFont(new Font("Monospace", Font.BOLD, 12));
        setLineWrap(true);
    }

    public OutputStream getStderr() {
        return stderr;
    }

    public OutputStream getStdout() {
        return stdout;
    }

    public InputStream getStdin() {
        return stdin;
    }

    public boolean isBounceKey() {
        return bounceKey;
    }

    public void setBounceKey(boolean bounceKey) {
        this.bounceKey = bounceKey;
    }
}
4

2 に答える 2

3

はい、PushbackInputStreamを参照してください。

于 2011-01-05T23:26:13.050 に答える
0

現在の行をバッファリングするために文字列を使用することにほとんど陥っています。

これが正しい方法です。行全体を保存し、ユーザーが「Enter」を押すまで何もしないでください。彼らはすべてを削除するかもしれません - あなたが通信しているプロセスがすでに行動を起こしている場合はどうなりますか?

つまり、あなたがしなければならないことは、あなたが何らかの理由で避けようとしていることです! :-)

于 2011-09-14T13:46:43.343 に答える