2013-08-06 4 views
4

소켓을 사용하여 Java 용 채팅을 만들고 있습니다. 내 문제는 사용자를위한 프레임에 처음으로 입력 할 때 캐럿이 다음 줄로 가고 그 뒤에는 백 스페이스 키를 눌러야한다는 것입니다. 그렇지 않으면 빈 문장이 내가 작성한 문장과 함께 전송되기 때문입니다. 나는 Enter 키를 누르기 위해 KeyListener를 사용하고 keyPressed 함수에 다음 코드를 입력했다.누른 후 JTextArea 입력하십시오.

if(arg0.getKeyCode()==10) 
    { 
     System.out.println("Bika sto enter\n"); 
     String toserver = ClientText.text2.getText(); 

     try { 
      if(toserver.equals("close it")) { 
       ClientText.clientSocket.close(); 
      } 



      ClientText.text2.moveCaretPosition(ClientText.text2.getSelectionStart()); 
      ClientText.text2.setCaretPosition(0); 
      ClientText.text2.setText(""); 
      ClientText.outToServer.writeBytes(toserver+'\n'); 
      //ClientText.outToServer.writeUTF(toserver+'\n'); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

처음으로 채팅을 사용한 후에 만 ​​작동한다는 것이 있습니다. 예를 들어 뭔가를 보내면 Enter 키를 누르면 캐럿이 다음 행으로 넘어갑니다. 그런 다음 무언가를 쓰고 Enter 키를 누르면 캐럿이 두 번째 줄이 시작됩니다. 따라서 빈 줄을 하나씩 지울 때마다 지울 필요가 있습니까? 감사합니다

+2

http://stackoverflow.com/a/2162974/1428683 약간의 연구 끝에 실제로이 게시물의 답변을 발견했습니다. – MikEKOU

+0

그 대답의 관련 부분을 게시하고 자신의 답변을 제공하고 올바른 표시를하면 나중에 방문하는 사람들에게 도움이 될 것입니다. (이 답변에서 그런 링크를 삭제하지 마십시오. 이 링크는이 페이지의 오른쪽에있는 __Linked__ Category 아래에서 활성 상태로 유지됩니다.) 다른 당신은 내 생각에 지금은 좋은 일이 아닌이 게시물을 삭제할 수 있습니다 :-) –

+0

나는 또한 어떤 종류의 채팅 프로토콜을 보길 제안합니다. 이것을 시도하십시오 http://tools.ietf.org/ html/rfc1459.html – Gianmarco

답변

0

정확하게 GUI가 어떻게 생겼는지 모르겠지만 JTextArea 대신 javax.swing.JTextField를 사용합니다. JTextArea (예 : 여러 줄의 메시지 허용)를 사용하고 Enter-to-Send 부분을 사용할 수 없으면 KeyListener를 키 입력으로 사용하는 것이 좋습니다 (예 : 일반 컴퓨터 모든 것이 실패하는 경우).

import java.awt.event.*; 
import javax.swing.JTextArea; //or JTextField 
public class KeyInput implements KeyListener{ 
    private JTextArea ta; //or JTextField 
    public KeyInput(JTextArea ta){ //or JTextField 
     this.ta = ta; 
    } 

    public void keyPressed(KeyEvent e){ 
     if(e.getKeyCode() == KeyEvent.VK_ENTER){ 
      //code to send message goes here 
     }else{ 
      ta.append("\n"+e.getKeyChar()); 
     } 
    } 
//keyReleased(KeyEvent) and keyTyped(KeyEvent) methods go here, need no content 
} 

당신이 JTextArea에를 사용하는 경우, JScrollPane의에 넣어해야합니다, 기억

이 무슨 뜻인지입니다.
중요 : 클라이언트 클래스에서 ta.setEditable(false)을 추가해야합니다. 여기서 ta는 JTextArea의 변수 이름입니다 (JTextField 대신 사용할 수 있음, JScrollPane이 필요하지 않음).

희망이 도움이됩니다.

+0

아마 이전에 물어 봤어야했는데, 누구나 upvote와 거의 순간적인 downvote에 대해 설명 할 수 있습니까? – Arc676