-3

类视图用于用户界面,它包含一个大的白色样式文本。

public class View extends ViewPart{
   public static StyledText txtArea;

   public void createPartControl(Composite parent){
   //...

   txtArea = new StyledText(parent, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
   txtArea.addText("My first line !");

   new Server("This is my new second line !").start();
   }

   public static void addText(String str){
      txtArea.append(str);
   }
}

class Server extends Thread{
   private String str;

   Server(String str){
      this.str = str;   
   }

   @Override
   public void run(){
      View.addText(str);
   }
}

类服务器不能调用 View.addText()。

如果我引用 txtArea 对象,它会起作用,但我必须调用 addText() 方法。

编辑:

线程“Thread-3”org.eclipse.swt.SWTException 中的异常:org.eclipse.swt.SWT.error(SWT.java:4361)处的线程访问无效

在 org.eclipse.swt.SWT.error(SWT.java:4276)

在 org.eclipse.swt.SWT.error(SWT.java:4247)

在 org.eclipse.swt.widgets.Widget.error(Widget.java:468)

在 org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:359)

在 org.eclipse.swt.custom.StyledText.setText(StyledText.java:9885)

在 com.project.udp.views.View.log(View.java:255)

在 com.project.udp.views.Server.run(View.java:294)

4

1 回答 1

0

问题是您的 Server 类的代码不在 SWT Display 线程上,因此告诉您的小部件更新是无效的线程访问。

您可能应该执行以下操作:

public static void addText(final String str){
  txtArea.getDisplay().asyncExec (new Runnable () {
    public void run () {
       if (!txtArea.isDisposed())
          txtArea.append(str);
    }
  }); 
}

使附加在正确的线程上执行。

有关 SWT 和线程的更多信息,请参阅 eclipse 指南:

http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fswt_threading.htm

于 2013-01-08T05:22:01.727 回答