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

Я веду чат. У меня есть один jFrame, созданный с помощью Netbeans, но у меня есть одна проблема. У меня есть 2 важных класса. Одним из них является сам интерфейс. Другой — это класс Java с методом запуска, который проверяет наличие новых сообщений. Я запущу поток, который запустит этот метод запуска. Каждый раз, когда я читаю сообщение, я хочу использовать метод отправки интерфейса. Этот метод добавит сообщение в 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 в разных файлах. Но не добавляется... Я много чего перепробовал, но не работает... По крайней мере, я могу точно сказать, что получаю сообщение, только оно не добавляется

заранее спасибо


person Olga    schedule 14.12.2013    source источник
comment
Для справки полный рабочий пример показан здесь.   -  person trashgod    schedule 14.12.2013
comment
Я только что видел ваш полный код и думаю, что проблема заключается только в концепции сокета и серверного сокета. Я могу предоставить вам простой пример до воскресенья, если хотите. Кроме того, взгляните на Java Net API и программирование Socket.   -  person Diversity    schedule 14.12.2013


Ответы (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); 
     }
 });

Итак, ваш 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
  }
});
}

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

person Diversity    schedule 14.12.2013
comment
ОГРОМНОЕ СПАСИБО. Я сейчас буквально плачу. Я провел около 2 ночей, пытаясь решить эту проблему! Большое спасибо! Если вам не трудно, не могли бы вы вкратце объяснить мне, что делает SwindUtilities.invokeLater(new Runnable())? Спасибо - person Olga; 14.12.2013
comment
Хорошо, проблема в том. Вы должны использовать разные темы. Один поток, который управляет вашим сетевым приложением Socket и потоком Swing. Если вы хотите влиять на какой-либо пользовательский интерфейс Swing извне SwingThread, он должен быть поставлен в очередь Swing (AWT-EventQueue, чтобы отобразить его правильно. Это делается с помощью метода invokeLater. Этот метод гарантирует, что переданный поток правильно вставлен в AWT-EventQueue и правильно выполнен Swing API - person Diversity; 14.12.2013