-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);
   }
}

Class Server は 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

問題は、サーバー クラスのコードが SWT ディスプレイ スレッド上にないため、ウィジェットに更新を指示することは無効なスレッド アクセスです。

おそらく次のようなことをする必要があります:

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 に答える