У меня есть два класса, которые должны обмениваться данными, но это не так. Один называется 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() линия: нет в наличии [локальные переменные недоступны]
Я не уверен, что это значит в точку. Упоминание потоков - это то, что заставило меня подумать, что делать вызов метода не синхронизируется с другим потоком.
Я решил эту же проблему с помощью ответа здесь: http: // stackoverflow.com/questions/4994759/how-to-receive-incoming-messages-using-smack-lib-on-xmpp – ManBugra