从我的Swing线程访问我的SWT线程的对象

时间:2017-07-06 15:27:54

标签: java eclipse multithreading eclipse-plugin swt-awt

所以我有一个SWT线程,一个eclipse插件,它包含一个简单的视图myView,其中嵌入了JPanel myJPanel和一个JTree myJTree。在Swing线程上有一个监听器,当我的JTree上的选择发生变化时,它会将JPanel刷新到Swing线程中。

我的myView的简化代码版本:

 public class myView extends ViewPart {
  public java.awt.Frame myFrame;

     @Override
      public void createPartControl(Composite parent) { 
        Composite myComposite = new Composite(parent, SWT.EMBEDDED);
        myFrame = SWT_AWT.new_Frame(myComposite); 
        myFrame.add(myJPanel);
        myFrame.repaint();
        myFrame.revalidate();

        //same kind of code for Jtree -> myJTreeFrame 
    }

myFrame的监听者必须刷新myJTree

时,我想要做的是从Swing线程刷新myJPanel

我想到了这个:

public void valueChanged(TreeSelectionEvent e) {
// some code that refresh myJPanel       

Display.getDefault().asyncExec(
    new Runnable() {
      public void run() {
          try { 
            myView view = (viewMap4j)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView( "pluginProject.myView");
          } catch (PartInitException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          view.myFrame.repaint();
          view.myFrame.revalidate(); 
      }
    });     
}

但是我在librairies中遇到了这个错误:不能抛出类型为PartInitException的异常;异常类型必须是Throwable的子类

我的问题是:如何在Swing线程中从我的SWT线程(此处为myView)访问对象? 以及使其在这个具体例子中起作用的任何想法?

1 个答案:

答案 0 :(得分:0)

这就是诀窍,它让我可以访问myView,我可以找到myFrame从JTree监听器刷新它:

  PlatformUI.getWorkbench().getDisplay().asyncExec(
            new Runnable() {
              public void run() {
                try {
                  myView view =null;
                  view = (myView)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("pluginProject.myView");
                  view.reloadMyFrame();
                } catch (CoreException e) {
                  e.printStackTrace();
                } 
              }
            });