2010-08-09 4 views
2

У меня есть два класса, которые должны обмениваться данными, но это не так. Один называется Chatter, и когда слушатель получает сообщение в Chatter, он должен вызывать метод во втором классе, который называется ClassView. Но я не думаю, что метод называется.Метод, кажется, не работает, когда он называется

Вот код для Болтовня:

package instantmessengerplugin; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.TableItem; 
import org.jivesoftware.smack.Chat; 
import org.jivesoftware.smack.ChatManager; 
import org.jivesoftware.smack.MessageListener; 
import org.jivesoftware.smack.PacketListener; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.filter.MessageTypeFilter; 
import org.jivesoftware.smack.filter.PacketFilter; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.packet.Packet; 

public class Chatter { 

    public XMPPConnection connection; 
    public String user; 
    public ClassView classView; 
    public Chat chat; 
    public PacketFilter packetFilter; 
    public PacketListener listener; 




    public Chatter(XMPPConnection connection1,String user1, Display dist) 
    { 
     connection = connection1; 
     user = user1; 

     openChat(); 
     classView = new ClassView(dist,chat); 
    } 

    public void openChat() 
    { 
     ChatManager cm = connection.getChatManager(); 
     chat = cm.createChat(user, new MessageListener() 
     { 
      public void processMessage(Chat chat ,Message message) 
      { 
       if(message.getType().equals(Message.Type.chat)) 
       { 
        //TableItem item = new TableItem(classView.chatViewer,SWT.NONE); 
        //item.setText("Them: " + message.getBody()); 
        System.out.println(message.getBody()); 
        classView.updateChat(message); 
       } 


      } 
     } 




     ); 


    } 





} 

А вот код ClassView:

package instantmessengerplugin; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.Table; 
import org.eclipse.swt.widgets.TableItem; 
import org.eclipse.swt.widgets.Text; 
import org.jivesoftware.smack.Chat; 
import org.jivesoftware.smack.ChatManager; 
import org.jivesoftware.smack.MessageListener; 
import org.jivesoftware.smack.Roster; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.packet.Message; 
import org.jivesoftware.smack.packet.Packet; 


public class ClassView { 

    public Display displayChat; 
    public Shell shellChat; 
    final Table chatViewer; 
    public Chat chat; 

    public ClassView(Display dist,Chat chat1){ 

     chat = chat1; 

     displayChat = dist; 
     shellChat = new Shell(displayChat); 
     GridLayout gridLayout = new GridLayout(); 
     gridLayout.numColumns = 2; 
     shellChat.setLayout(gridLayout); 

     Label contact = new Label(shellChat,SWT.NONE); 
     GridData data = new GridData(); 
     data.horizontalAlignment = GridData.FILL; 
     data.horizontalSpan = 2; 
     data.grabExcessHorizontalSpace = true; 
     data.grabExcessVerticalSpace = true; 

     chatViewer = new Table(shellChat,SWT.NONE); 
     data = new GridData(); 
     data.horizontalSpan = 2; 
     data.horizontalAlignment = GridData.FILL; 
     data.verticalAlignment = GridData.FILL; 
     data.grabExcessHorizontalSpace = true; 
     chatViewer.setLayoutData(data); 

     final Text chatBox = new Text(shellChat,SWT.SINGLE); 
     data = new GridData(); 
     data.verticalAlignment = GridData.FILL; 
     data.horizontalAlignment = GridData.FILL; 
     data.grabExcessHorizontalSpace = true; 
     chatBox.setLayoutData(data); 

     Button send = new Button(shellChat,SWT.PUSH); 
     send.setText("Send"); 

     send.addSelectionListener(new SelectionAdapter(){ 

      public void widgetSelected(SelectionEvent e) 
      { 

       String s = chatBox.getText(); 
       TableItem item = new TableItem(chatViewer, SWT.NONE); 
       item.setText("Me: " + s); 
       try { 
        chat.sendMessage(s); 
       } catch (Exception e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

       chatBox.setText(""); 
      } 

     }); 










     shellChat.pack(); 
     shellChat.open(); 

     while(!shellChat.isDisposed()) 
     { 
      if(!displayChat.readAndDispatch()) 
      { 
       displayChat.sleep(); 
      } 
     } 



    } 


    public void updateChat(Message message) 
    { 
     TableItem item = new TableItem(chatViewer,SWT.NONE); 
     item.setText("Them: " + message.getBody()); 
    } 



} 

Когда метод ProcessMessage в Болтовня называется он должен говорить ClassView, который будет вызывать updateChat который затем изменяет объект таблицы в ClassView. Кажется, это не происходит. Таблица не изменяется, и не возникает исключение. Я знаю, что болтовня работает правильно, потому что она отлично печатает сообщение на консоли.

Кто-нибудь знает, почему updateChat, похоже, не называется?

Update:

Я побежал отладчик на код в вопросе. Вот стек отладки, что вызывается при исполнении:

FutureTask $ Sync.innerRun() линия: нет в наличии [локальные переменные недоступны]

FutureTask.run() линия: нет в наличии
ThreadPoolExecutor $ Worker .runTask (Runnable) линия: нет в наличии
ThreadPoolExecutor $ Worker.run() линия: нет в наличии
Thread.run() линия: нет в наличии [локальные переменные недоступны]

Я не уверен, что это значит в точку. Упоминание потоков - это то, что заставило меня подумать, что делать вызов метода не синхронизируется с другим потоком.

+0

Я решил эту же проблему с помощью ответа здесь: http: // stackoverflow.com/questions/4994759/how-to-receive-incoming-messages-using-smack-lib-on-xmpp – ManBugra

ответ

0

Это предположение, но, похоже, ваше сообщение updateChat просто создает TableItem без добавления его в любую таблицу.

public void updateChat(Message message) 
{ 
    TableItem item = new TableItem(chatViewer,SWT.NONE); 
    item.setText("Them: " + message.getBody()); 
} 
+0

«chatViewer» - это объект таблицы. Элемент таблицы создается в таблице, включающей добавление элемента в таблицу. Но таблица может быть обновлена ​​(есть метод «refresh» где-то, возможно, на 'chatViewer', возможно, на его родителя) –

0

Вы должны отлаживать код с помощью eclipse (предположим, что вы используете эту среду IDE при использовании SWT). Установите точку останова внутри processMessage и выполните код. Затем вы увидите, вызвано ли updateChat или нет.

+0

Я использовал отладчик, как вы сказали. Оказывается, updateChat не вызвал. Однако, если вы вызываете updateChat из собственного класса, он отлично работает. Я думаю, что код в классе Chatter должен быть синхронизирован с потоком пользовательского интерфейса в классе ClassView. Но я не уверен, как это сделать. Это метод syncExec? – Joshy910

+0

Но тогда - то, что * is * вызывается в строке 'classView.updateChat (message);', программа должна продолжить что-то, и вы сказали, что предыдущая строка * получает * выполнена. –

+0

Я обновил вопрос с подробной информацией о том, что вызывается в classView.updateChat (сообщение). – Joshy910

0

У меня была подобная ошибка с Smack, в моем случае трюк заключался в том, что настоящей ошибкой было исключение NullPointer. Вот мой код:

for(PartnerMessageCallback callback : callbacks) { 
    callback.processMessage(null, message); 
} 

NullPointer исключение выброшено из ProcessMessage, но я вижу следующее в StackTrace:

линии

FutureTask $ Sync.innerRun(): не доступные [локальные переменные недоступно]

В моем случае, просто попробуй поймать решить эту проблему:

for(PartnerMessageCallback callback : callbacks) { 
    try { 
    callback.processMessage(null, message); 
    } catch (Exception ex) { 
    ex.printStackTrace(); 
    } 
} 

Я надеюсь, что это помогает.

Смежные вопросы