2017-04-17 37 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

糟糕。你是对的!谢谢 –