2011-01-05 73 views
1

我有一個BufferedWriter,我使用它將字符寫入PipedInputStream。基於鍵盤事件。但是我正在實現一個退格處理程序,但是我看不到沒有辦法的方法。有沒有Java相當於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; 
    } 
} 
+1

如果你有一個退格,你會如何提出處理它,但是你將這些東西輸入的應用程序已經佔用了最後一個字符,並且已經完成了某些操作? – 2011-01-05 23:26:58

回答

0

我幾乎回落到使用字符串緩衝當前行。

這是正確的方法:保存整條線,不要做任何事情,直到用戶按下「enter」。他們可能會刪除整個事情 - 如果您正在與之溝通的流程已經採取行動,該怎麼辦?

I.e.你應該做的是你出於某種原因想避免做的事情! :-)