Я не могу получить доступ к jEditorPane пользователя из другого класса

Я делаю чат с. У меня есть один jFrame, созданный с Netbeans, но у меня есть одна проблема. У меня есть 2 важных класса. Одним из них является сам интерфейс. Еще один класс Java с методом run, который проверяет наличие новых сообщений. Я начну поток, который будет запускать этот метод запуска. Каждый раз, когда я читаю сообщение, я хочу использовать метод send интерфейса. Этот метод добавит сообщение в JEditorPane. Но это не добавляет его. Я получаю сообщение, но оно не появляется на панели jeditorpane... Не могли бы вы помочь мне, пожалуйста?

Этот метод находится на ClientForm1(интерфейс). Он добавит текст в панель редактора. Я начинаю здесь тему, чтобы проверить входящие сообщения

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

И это метод запуска для проверки входящих сообщений с сервера. Все переменные 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 ответ

Решение

Позаботьтесь о вызове метода SWT или Swing из потоков, которые не принадлежат исходному потоку Swing или SWT -> Другой процесс или 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); 
     }
 });

Так что ваш любимец должен выглядеть так

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

Я думаю, что должна быть ваша проблема.

Другие вопросы по тегам