我目前正在用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圖片。
我認爲這是因爲您的閱讀機制第一次遇到'-1'時會停止,這發生在您完成「發送」第一條消息的時間點。之後,你永遠不會重新啓動閱讀器,並且你也從來沒有完全重置你的輸入流(它不會在讀取時阻塞,因爲'text'不會爲空) –
我添加了一個圖像作爲參考。看看那 –
我幾乎不知道該圖像可以提供什麼幫助。 –