0

所以我有一个 SWT 线程,一个包含一个简单视图的 eclipse 插件,其中嵌入myView了一个 JPanelmyJPanel和一个 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从 Swing 线程刷新,当监听myJTree器必须刷新时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(); 
      }
    });     
}

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

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

4

1 回答 1

0

这成功了,它让我可以访问myViewmyFrameJTree 侦听器刷新它的位置:

  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();
                } 
              }
            });
于 2017-07-07T09:45:22.240 回答