2017-04-17 1 views
0

현재 Java로 채팅 응용 프로그램을 설계하고 있습니다. 따라서 나는 JFrame을 만들었습니다. System.out에 쓰여진 모든 내용은 JTextArea에 쓰여지고 System.inJTextField으로 리디렉션하고 싶습니다.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){} 

첫 번째 시간 I 입력 텍스트 입력하고 Enter 키를 누릅니다, 그냥 잘 작동 나는이 문제를 처리해야하는지 간단한 클래스를 썼다. 메시지를 출력 한 후 read() 함수가 호출되었지만 더 많은 텍스트를 입력하려고 시도하면 read() 함수가 더 이상 호출되지 않습니다. 이 문제를 해결할 제안이 있습니까?

this 이미지를보십시오.

+0

첫 번째 메시지를 "보내기"를 마친 시점에서 처음으로 '-1'을 만나면 읽기 메커니즘이 중지되기 때문입니다. 그리고 그 후에는 독자를 절대 다시 시작하지 않고 입력 스트림을 완전히 재설정하지 않습니다 ('text'가 null이 아니기 때문에 더 이상 읽기를 차단하지 않습니다). –

+0

이미지를 참조로 추가했습니다. 그걸보세요 –

+0

그 이미지가 어떻게 도움이 될지 전혀 모르겠습니다. –

답변

1

Enter를 처음 눌렀을 때 text""으로 설정합니다. 그런 다음이 블록은 b = -1이 설정 : 값이

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

을 당신의 메인 루프 마감을하게 read 돌아갑니다.

+0

그러나 입력을 누르면 텍스트가 바뀌고'' "'이 아니라면 b는 텍스트의 첫 번째 문자와 같습니다. –

+0

죄송합니다. 네가 옳아! 감사 –

관련 문제