所以我有一个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
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
)访问对象?
以及使其在这个具体例子中起作用的任何想法?
答案 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();
}
}
});