我有一個AbstractViewPart
類延伸ViewPart
用createHeaderComposite()
定義的抽象方法。但是,當我嘗試更新子組合上的標籤時,它會引發空指針異常。更新子組合中的SWT UI組件給出空指針異常
任何想法可能是什麼問題?
public abstract class AbstractViewPart extends ViewPart
{
protected AbstractComposite m_headerComposite = null;
public abstract AbstractComposite createHeaderComposite(Composite parent);
@Override
public void createPartControl(Composite parent)
{
m_headerComposite = createHeaderComposite(parent);
}
private class IC_SelectionListener implements ISelectionListener
{
public void selectionChanged(final IWorkbenchPart part, final ISelection selection) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (selection != null) {
if (selection instanceof StructuredSelection) {
StructuredSelection ss = (StructuredSelection) selection;
if (!ss.isEmpty())
{
if(ss.getFirstElement() instanceof AIFComponentContext)
{
m_selectedComp = ((AIFComponentContext) (ss.getFirstElement())).getComponent();
m_headerComposite.updateComposite();
}
}
}
}
}
});
}
}
}
public class MyView extends AbstractViewPart
{
@Override
public AbstractComposite createHeaderComposite(Composite parent)
{
return new MyHeaderComposite(parent, getSelectedObject());
}
}
public abstract class AbstractComposite extends Composite
{
protected InterfaceAIFComponent m_selectedComp = null;
public abstract void createComposite();
public abstract void updateComposite();
public AbstractComposite(Composite parent, int style)
{
super(parent, style);
createComposite();
}
public AbstractComposite(Composite parent, int style, InterfaceAIFComponent comp)
{
super(parent, style);
this.m_selectedComp = comp;
createComposite();
}
public InterfaceAIFComponent getSelectedComponent()
{
return m_selectedComp;
}
}
public class MyHeaderComposite extends AbstractComposite
{
private Label m_lblObjectName = null;
public MyHeaderComposite(Composite parent, InterfaceAIFComponent comp)
{
super(parent, SWT.NONE, comp);
}
@Override
public void createComposite()
{
//This is the Header Composite to which we add other composites and elements
//Apply layout to this Header Composite
GridData gd_composite = new GridData(SWT.FILL, SWT.CENTER, true, false);
this.setLayoutData(gd_composite);
this.setLayout(new GridLayout(2, false));
//Start adding other elements to this Header composite
m_lblObjectName = new Label(this, SWT.NONE);
m_lblObjectName.setFont(new Font(Display.getDefault(), "Segoe UI", 15, SWT.NORMAL));
m_lblObjectName.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
m_lblObjectName.setText(m_selectedComp.toString());
}
@Override
public void updateComposite()
{
this.m_lblObjectName.setText(m_selectedComp.toString()); // m_lblObjectName is always null. Throws null pointer exception
}
}
在updateComposite()方法,在調試模式下,我可以看到的「本」的值,它是MyHeaderComposite {}但在它的UI標籤爲空。
這裏是堆棧跟蹤:
ERROR: 14:56:10,922 - TcLogger$IC_LogListener.logging:?
org.eclipse.core.runtime - org.eclipse.ui - 0 - Unhandled event loop exception
org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.NullPointerException)
at org.eclipse.swt.SWT.error(SWT.java:4361)
at org.eclipse.swt.SWT.error(SWT.java:4276)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:138)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4144)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499)
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at com.teamcenter.rac.aifrcp.Application.runApplication(Unknown Source)
at com.teamcenter.rac.aifrcp.Application.start(Unknown Source)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
at org.eclipse.equinox.launcher.Main.main(Main.java:1414)
Caused by: java.lang.NullPointerException
at com.hm.teamcenter.rac.views.MyHeaderComposite.updateComposite(MyHeaderComposite.java:47)
at com.hm.teamcenter.rac.views.AbstractViewPart.updateHeaderComposite(AbstractViewPart.java:174)
at com.hm.teamcenter.rac.views.AbstractViewPart.updateSelectionChange(AbstractViewPart.java:161)
at com.hm.teamcenter.rac.views.AbstractViewPart$IC_SelectionListener$1.run(AbstractViewPart.java:147)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
我們展示的堆棧跟蹤 –
新增的堆棧跟蹤 – Rakesh