2011-12-27 40 views
2

我在組合中有2個TableViewer控件(假設它們是:viewer1,viewer2)。當初始化應用程序時,一個「viewer1」從服務器填充數據,而「viewer2」設置爲空。將數據添加到TableViewer時出現異常

viewer1.setInput(getData()); 
viewer2.setInput(null); 

現在我想通過上下文菜單改變從viewer1一些對象viewer2,第一次添加成功,但下一次,當我填寫對象viewer2,我總是得到這個例外: java.lang.UnsupportedOperationException

這並沒有發生,如果viewer2預先包含一些物體,它只有當viewer2是空的情況。 這是我補充的viewer1一些數據移動到viewer2方式:當viewer2包含了一些數據,下一次

//get selected objects in Viewer1 
IStructuredSelection selection= (IStructuredSelection) viewer1.getSelection(); 
if(selection!=null){ 
      selectedList=(List<MyObject>)selection.toList(); 
      for(MyObject obj: selectedList){ 
       //do something here 
      } 
      //remove all 
      ((List<MyObject>)viewer1().getInput()).removeAll(selectedList); 
      viewer1.refresh(); 
     } 
//viewer1 get above List 
if((List<MyObject>)viewer2.getInput()==null) 
viewer2.setInput(selectedList); 
else { 
((List<MyObject>)viewer2.getInput()).addAll(selectedList); //(Line Error) 
} 
viewer2.refresh; 

它在IF條件第一次效果很好,但是,我總是在上面的錯誤行中得到例外。 @Krumelur,我加堆棧跟蹤,我得到:

!ENTRY org.eclipse.ui 4 0 2011-12-27 16:26:50.660 
!MESSAGE Unhandled event loop exception 
!STACK 0 
java.lang.UnsupportedOperationException 
    at java.util.AbstractList.add(Unknown Source) 
    at java.util.AbstractList.add(Unknown Source) 
    at java.util.AbstractCollection.addAll(Unknown Source) 
    at com.saltlux.om.client.customwidgets.NeutralSetWidget.getReviewFromOtherWidget(NeutralSetWidget.java:39) 
    at com.saltlux.om.client.customwidgets.NeutralSetWidget$1.handleEvent(NeutralSetWidget.java:24) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 
    at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774) 
    at com.saltlux.om.client.customwidgets.PositiveSetWidget.add2TrainingSet(PositiveSetWidget.java:107) 
    at com.saltlux.om.client.customwidgets.TrainingReviewWidget$10.run(TrainingReviewWidget.java:288) 
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:498) 
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584) 
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501) 
    at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) 
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696) 
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660) 
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494) 
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
    at com.saltlux.om.client.Application.start(Application.java:21) 
    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:344) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
    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:622) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1410) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1386) 

請幫助我。非常感謝任何答案!

+1

你有異常的堆棧跟蹤嗎? – Krumelur

回答

0

不是所有的實現java.util.List接口都支持addAll()方法。例如,由Arrays.asList()返回的那個不是,這是StructuredSelection.toList()使用的方法。

+0

馬爾蒂·喜,它只有在查看器被預先設置爲NULL時纔會發生。如果它包含一些數據,那麼addAll()方法一直很好。我想這不是問題 – zungnv

+0

@zungnv更新我的答案是更清楚。 –

+0

感謝馬蒂,現在更清楚了。當我檢查這個 viewer2.getInput()。getClass() - >它是「java.util.Arrays $ ArrayList」 所以我不能使用這個類類型的addAll()方法。 我改變了爲viewer2 setInput的方式如下,它工作正常: 'viewer2.setInput(new MyObject()); //而不是setInput(null)' – zungnv

0

這聽起來像是從您的內容提供商拋出異常。你是否檢查過你的內容提供者是否真的接受了列表?你使用什麼內容提供商?

+0

喜Krumelur! 'viewer1.setContentProvider(new ContentProvider ());' 它當然接受ContentProvider,因爲我可以在第一次正常設置輸入。 '公共類的ContentProvider 實現IStructuredContentProvider { \t @覆蓋 \t公共Object []對象的getElements(對象inputElement){ \t \t如果(inputElement!= null){ \t \t \t List models =(List )inputElement; \t \t \t return models.toArray(); \t \t} \t \t return null; \t} \t @覆蓋 \t公共無效的Dispose(){ \t} \t @覆蓋 \t公共無效把inputChanged(查看器瀏覽器,對象oldInput,對象newInput){ \t} }' – zungnv

0

我發現了一個解決辦法,改變初始化輸入viewer2如下的方式:

viewer2.setInput(new ArrayList<MyObject>()) 

之前,我設置爲NULL輸入,也無法用方法中的addAll()來添加更多的objectes到tableviewer。 謝謝大家的幫助。 此致敬禮!

相關問題