2011-01-05 3 views
1

У меня есть BufferedWriter, к которому я использую, чтобы писать символы в PipedInputStream. На основе событий клавиатуры. Но я реализую обработчик backspace, но я не вижу никакого способа сделать это без unputc.Есть ли эквивалент 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

Как бы вы предложили обработать его, если у вас есть обратное пространство, но приложение, которое вы пишете этот материал, уже поглотило последнего персонажа и ушло и уже что-то уже делало? –

ответ

0

Я почти возвращаюсь к использованию строки для буферизации текущей строки.

Это правильный способ сделать это: сохранить всю линию и не делать с ней ничего, пока пользователь не нажмет «войти». Они могут удалить все это - что, если процесс, с которым вы общаетесь, уже принял меры?

I.e. что вы должны делать, это то, что вы по какой-то причине пытаетесь избежать! :-)

Смежные вопросы