2017-04-17 87 views
0

我目前正在用Java設計一個聊天應用程序。因此我創建了我自己的JFrame。所有寫入System.out的內容都寫入JTextArea,我想要重定向System.in以使用我的JTextField。我寫了一個簡單的類應該怎樣處理這個問題:Java System.in不能使用自定義流

public class InputField extends InputStream implements KeyListener { 
    private JTextField textField; 
    private String text = null; 


    public InputField(JTextField textField){ 
     this.textField = textField; 

     textField.addKeyListener(this); 
    } 

    @Override 
    public int read() throws IOException { 
     //System.out.println("CALLED!"); 
     while (text == null) 
      ; 

     int b; 

     if (Objects.equals(text, "")) { 
      b = -1; 
      text = null; 
     } else { 
      b = text.charAt(0); 
      text = text.substring(1, text.length()); 
     } 

     // System.out.println("GIVING: " + b); 

     return b; 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_ENTER) { 
      text = textField.getText(); 
      System.out.println("ENTER: "+ text); 
      textField.setText(""); 
     } 
    } 

    @Override 
    public void keyTyped(KeyEvent e) {} 

    @Override 
    public void keyReleased(KeyEvent e) {} 
} 

我讀機制:

StringBuilder cmd = new StringBuilder(); 
int b; 

try { 
    while ((b = System.in.read()) != -1) 
     cmd.append(b); 
    // Do something with cmd 
} catch (IOException e){} 

我第一次輸入任何文字,然後按回車,它工作得很好。在輸出消息後,調用read()函數,但如果我嘗試輸入更多文本,則不會再調用read()函數。任何建議來解決這個問題?

看一看this圖片。

+0

我認爲這是因爲您的閱讀機制第一次遇到'-1'時會停止,這發生在您完成「發送」第一條消息的時間點。之後,你永遠不會重新啓動閱讀器,並且你也從來沒有完全重置你的輸入流(它不會在讀取時阻塞,因爲'text'不會爲空) –

+0

我添加了一個圖像作爲參考。看看那 –

+0

我幾乎不知道該圖像可以提供什麼幫助。 –

回答

1

第一次點擊輸入時,它將text設置爲""。然後,該塊設置b = -1

if (Objects.equals(text, "")) { 
     b = -1; 

是哪個值read回報,這使得您的主循環完成。

+0

但是,當我按下回車鍵時,文本會發生變化,如果不是''「',那麼b等於文本的第一個字符。 –

+0

糟糕。你是對的!謝謝 –