2011-01-05 15 views
1

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

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

おそらく、私はキャンバスを使用してより良い仕事をすることができました。 (私が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; 
    } 
} 
+1

あなたがバックスペースを持っていればそれを処理する方法を提案しますが、このものを配管していたアプリケーションはすでに最後の文字を消費していて既に何かをしていましたか? –

答えて

0

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

これは正しい方法です。行全体を保存し、ユーザーが「入力」を押すまで何もしないでください。彼らは全体を削除するかもしれません - あなたがコミュニケーションしているプロセスがすでに行動を起こしていたら?

I.e.あなたがしなければならないことは、何らかの理由であなたがやることを避けようとしていることです! :-)

関連する問題