2016-05-23 15 views
0

我有一個AbstractViewPart類延伸ViewPartcreateHeaderComposite()定義的抽象方法。但是,當我嘗試更新子組合上的標籤時,它會引發空指針異常。更新子組合中的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) 
+1

我們展示的堆棧跟蹤 –

+0

新增的堆棧跟蹤 – Rakesh

回答

0

調用new MyHeaderComposite(parent)不打任何你定義的自定義構造函數,因此不會叫createComposite()

因此,this.m_lblObjectNameupdateComposite()null,因爲它尚未設置。

+0

新增getSelectedObject()參數在「新MyHeaderComposite(父)」代碼行,仍然同樣的錯誤出現 – Rakesh

+0

@ user1039499您能查看什麼'getSelectedObject()'返回」不是個t'null'? – Baz

+0

它不爲空。它有有效的組件。我猜測一些與在子代上定義的UI控件的範圍有關,而不是父組合。 – Rakesh