코드를 실행하려고 할 때 "잘못된 스레드 액세스"라는 SWTException이 계속 나타납니다. 내가 읽고 문제가 UI 스레드 외부에서 SWT 개체에 액세스하려고 코드가있을 것 같습니다. 특히 테이블 위젯이 있고 선택 리스너가 추가되었습니다. 다음은 선택 수신기의 코드입니다. 그것을 포장하여표준 위젯 툴킷에서 UI 스레드와 코드를 동기화하는 방법
public void createChat(final XMPPConnection connection,final SelectionEvent event)
{
Display.getDefault().syncExec(new Runnable()
{
public void run()
{
String s = event.item.toString();
int length = event.item.toString().length();
ClassView cv = new ClassView(connection,s.substring(11,length -1),null);
}
});
당신은 내가 너무 UI 스레드 외부에있는 코드를 동기화 시도했습니다 볼 수 있듯이, UI 스레드와 :
rosterTable.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(final SelectionEvent event)
{
createChat(connection,event);
}
});
여기가 createChat 방법에 대한 코드입니다 syncExec 메서드에서하지만 여전히 테이블 항목을 선택했을 때 예외가 발생합니다.이 예외가 발생하면 syncExec 부분을 잘못된 위치에 넣었습니다.
또한 createChat 메서드에서 인스턴스화 된 ClassView 개체가 SWT 위젯을 사용한다는 사실 때문에 문제가 발생할 수 있다고 생각하지만 확실하지 않습니다.
누구든지 syncExec 코드가 있어야하는 위치를 알고 있습니까?
아니면 완전히 잘못하고있는 경우 어떻게 해결할 수 있습니까?
업데이트 :
나는 지금, 나는 그것을해야한다 생각하지 않는다 조금 다른 외모 때문에, 내가 코드에 대한 재 설계의 조금 한 일을 당신이 말한 불행하게도 나는 여전히 예외를 받고 있어요했다
rosterTable.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(final SelectionEvent event)
{
selectedUser = event.item.toString();
System.out.println(selectedUser);
rm.createChat(selectedUser);
}
});
여기에 지금 다른 클래스에있는 메서드에 대한 코드입니다 : 어떤 차이가 있지만 단지의 경우 여기에 다시 청취자에 대한 코드의
public void createChat(String item)
{
int length = item.length();
Chatter c = new Chatter(connection,item.substring(11,length-1));
}
그녀의
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3884)
at org.eclipse.swt.SWT.error(SWT.java:3799)
at org.eclipse.swt.SWT.error(SWT.java:3770)
at org.eclipse.swt.widgets.Display.checkDisplay(Display.java:721)
at org.eclipse.swt.widgets.Display.create(Display.java:783)
at org.eclipse.swt.graphics.Device.<init>(Device.java:135)
at org.eclipse.swt.widgets.Display.<init>(Display.java:454)
at org.eclipse.swt.widgets.Display.<init>(Display.java:445)
at instantmessengerplugin.ClassView.<init>(ClassView.java:33)
at instantmessengerplugin.Chatter.<init>(Chatter.java:20)
at instantmessengerplugin.RosterManager.createChat(RosterManager.java:48)
at instantmessengerplugin.RosterView$1.widgetSelected(RosterView.java:103)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473)
at instantmessengerplugin.RosterView.<init>(RosterView.java:158)
at instantmessengerplugin.Connection.connect(Connection.java:110)
at instantmessengerplugin.Connection$1.widgetSelected(Connection.java:65)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3880)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3473)
at instantmessengerplugin.Connection.<init>(Connection.java:77)
at instantmessengerplugin.Connection.main(Connection.java:119)
스택 추적을 포함하여 질문을 업데이트했습니다. – Joshy910
createChat() 코드를 보았지만 stacktrace에 따라 Chatter의 생성자에서 호출되는 ClassView 생성자에서 실제로 예외가 발생합니다. 이 두 클래스에 관련 코드를 게시 할 수 있습니까? 우리는 이것을 아직 추적하지 않을 것이다. – rancidfishbreath