2010-08-09 58 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); 
       } 


      } 
     } 




     ); 


    } 





} 

這裏是類視圖代碼:

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中更改表格對象。它似乎並沒有發生。表格沒有改變,沒有拋出異常。我知道chatter工作正常,因爲它將消息打印到控制檯就好了。

有誰知道爲什麼updateChat似乎沒有被調用?

更新:

我已經跑在有問題的代碼調試器。下面是現在被稱爲在執行調試堆棧:

FutureTask $ Sync.innerRun()行:不可用[局部變量不可用]

FutureTask.run()行:不可用
的ThreadPoolExecutor $工人.runTask(可運行)行:不可用
的ThreadPoolExecutor $ Worker.run()行:不可用
Thread.run()行:不可用[局部變量不可用]

我不知道這意味着什麼究竟。提到線程是什麼讓我認爲這是做的方法調用不與另一個線程同步。

+0

我解決了同樣的問題,在這裏的答案幫助:http:// stackoverflow。com/questions/4994759/how-to-receive-incoming-messages-using-smack-lib-on-xmpp – ManBugra 2011-02-19 20:28:27

回答

0

這是猜測,但它看起來你的updateChat消息只是創建一個TableItem而不添加到任何表。

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

「chatViewer」是表格對象。表格項目在該表格上創建,其中包括將該項目添加到表格中。但是表格可能需要刷新(某處有'refresh'方法,可能在'chatViewer'上,也許在其父上) – 2010-08-09 12:07:35

0

您應該使用eclipse來調試代碼(當您使用SWT時,請使用此IDE)。在processMessage內設置一個斷點並逐步完成代碼。然後你會看到是否調用updateChat

+0

我使用了像你說的調試器。原來updateChat沒有被調用。但是,如果你從它自己的類中調用updateChat,它可以正常工作。我認爲Chatter類中的代碼必須與ClassView類中的UI線程同步。但我不知道如何做到這一點。它是syncExec方法嗎? – Joshy910 2010-08-10 10:11:11

+0

然後 - 在'classView.updateChat(message)'行調用了* *,程序必須在某處繼續,並且你說上一行*被執行。 – 2010-08-10 10:57:36

+0

我已更新了有關在classView.updateChat(消息)處調用的詳細信息的問題。 – Joshy910 2010-08-12 14:33:46

0

我有一個與Smack類似的錯誤,在我的情況下,訣竅是真正的bug是一個NullPointer異常。這裏是我的代碼:

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

一個空指針異常已從而processMessage拋出,但我看到的堆棧跟蹤如下:

FutureTask $ Sync.innerRun()行:不可用[局部變量不可用]

在我的情況下,簡單的try-catch解決了這個問題:

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

我希望它可以幫助你。

相關問題