2013-12-14 2 views
0

채팅 룸을 사용하고 있습니다. Netbeans로 만든 jFrame이 하나 있지만 문제가 하나 있습니다. 나는 2 개의 중요한 과목을 가지고있다. 그 중 하나는 인터페이스 자체입니다. 또 하나는 새로운 메시지를 ckecks하는 run 메소드가있는 자바 클래스이다. 이 run 메서드를 실행할 스레드를 시작합니다. 메시지를 읽을 때마다 인터페이스 보내기 메소드를 사용하려고합니다. 이 메소드는 JEditorPane에 메세지를 추가합니다. 하지만 추가하지는 않습니다. 나는 메시지를 받았지만 jeditorpane에 나타나지 않습니다 ... 도와 주시겠습니까?다른 클래스의 사용자 jEditorPane에 액세스 할 수 없습니다.

이 방법은 ClientForm1 (인터페이스)에 있습니다. 편집기 창에 텍스트를 추가합니다. 여기 들어오는 메시지를 확인하기위한 스레드를 시작합니다.

public void send(String message){ 
    String messages; 
    messages = jEditorPane1.getText(); 
    jEditorPane1.setText(messages+message+"\n"); 
} 

그리고 이것은 서버에서 들어오는 메시지를 확인하기위한 실행 방법입니다. 모든 JFrame 변수는 private입니다.

public ResMesClient(Socket socket, BufferedReader br, PrintStream p){ 
    this.socket = socket; 
    is=br; 
    ps = p; 
} 
@Override 
@SuppressWarnings("empty-statement") 
public void run(){ 
    String messages; 
    try { 
    //This thread will read the server messages 
     ClientForm1 cf = new ClientForm1(socket,ps); //I create an object 
     JFrame frame1 = cf; //I create a frame and set it visible. 
     frame1.setVisible(true); 
    while(true){ 
     messages = is.readLine(); 
     System.out.println("From ResMesClient : "+messages); 
     if(!messages.equals("QUITCLIENT")); 
     else cf.send("Set text works"); //I call a send method of ClientForm1 class 
    } 
    } catch (IOException ex) { 
    } 

이 두 파일은 서로 다른 두 개의 Java 클래스입니다. 하지만 추가하지 않았습니다 ... 많은 일을 시도했지만 작동하지 않습니다 ... 적어도 메시지를 받았다는 것을 확실히 말할 수 있습니다.

미리 감사드립니다.

+1

참고로 완전한 작동 예제가 [here] (http://stackoverflow.com/a/3245805/230513)에 나와 있습니다. – trashgod

+0

방금 ​​전체 코드를 보았는데 문제는 소켓과 서버 소켓 개념이라고 생각합니다. 원한다면 일요일까지 간단한 예제를 제공 할 수 있습니다. 또한 Java Net API 및 소켓 프로그래밍을 살펴보십시오. – Diversity

답변

0

원래 Swing 또는 SWT Thread -> Other Process 또는 ThreadGroup에 속하지 않는 스레드에서 SWT 또는 Swing 메소드를 호출하십시오. 그것은 text.setText 메소드를 호출하는 것을 의미 SWT를 사용

스윙을 사용하여 표시 객체

display.asyncExec(new Runnable() { 
    public void run() { 
     cf.send(message) 
    } 
}); 

을 사용하여 실행

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     cf.send(message); 
    } 
}); 

그래서 당신 looü이

while(true){ 
    messages = is.readLine(); 
    System.out.println("From ResMesClient : "+messages); 
    if(!messages.equals("QUITCLIENT")) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
      cf.send(message); 
     } 
    } else { 

     //Quit programm or whatever 
    } 
}); 
} 
과 같아야 의미해야

문제가 있다고 생각합니다.

+0

고맙습니다. 나는 지금 실제로 울고있다. 나는 2 밤을이 문제를 해결하는 것을 시도하는 같이 썼다! 정말 고맙습니다! 어려운 일이 아니라면 SwindUtilities.invokeLater (새로운 Runnable())이 무엇인지 간략하게 설명해 주시겠습니까? 고맙습니다. – user2350122

+0

문제는 있습니다. 당신은 다른 쓰레드가 있어야합니다. 소켓 네트워크 어플리케이션과 스윙 스레드를 제어하는 ​​하나의 스레드. SwingThread 외부에서 어떤 종류의 Swing UI에 영향을 주길 원한다면, Swing UI를 올바른 방법으로 표시하기 위해 Swing (AWT-EventQueue)에 대기열에 있어야합니다 (이 방법은 invokeLater 메소드를 사용하여 수행됩니다). 건네받은 thread가 AWT-EventQueue에 올바르게 삽입되어, Swing API에 의해 올바른 방법으로 실행됩니다. – Diversity