我无法从另一个类访问用户的jEditorPane

时间:2013-12-14 00:30:45

标签: java swing jframe chat jeditorpane

我正在聊天室。我有一个用Netbeans创建的jFrame,但我有一个问题。我有两个重要的课程。其中之一就是界面本身。另一个是带有run方法的java类,它可以阻止新消息。我将启动一个运行此run方法的线程。每次我阅读消息时,我都想使用接口的方法发送。此方法将消息附加到JEditorPane。但它没有附加它。我确实收到了一条消息,但它没有出现在jeditorpane中......你能帮助我吗?

此方法在ClientForm1(接口)上。它会将文本附加到编辑窗格。我从这里开始一个线程来检查收到的消息

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

这是用于检查来自服务器的传入消息的run方法。所有JFrame变量都是私有的。

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 个答案:

答案 0 :(得分:0)

注意从不属于原始Swing或SWT线程的线程调用SWT或Swing方法 - >其他进程或ThreadGroup。

使用SWT意味着调用text.setText方法必须使用Display对象

执行
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
  }
});
}

我认为应该有你的问题。