문제

I have 2 TableViewer controls in a composite (Supposed they are : viewer1, viewer2). When initialize application, one "viewer1" is filled data from server while "viewer2" is set null.

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

Now I want to change some object from viewer1 to viewer2 via a context menu, the first time add is successful, but the next time when I fill object to viewer2, I always get this exception: java.lang.UnsupportedOperationException

This didn't happen if viewer2 contain some objects in advance, it only happens when viewer2 is empty. This is the way I add move some data from viewer1 to 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;

It works well at the first time in the IF condition, but the next time when viewer2 contained some data, I always get exception at above error line. @Krumelur , I added stacktrace that I got:

!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)

Please help me out. Thanks so much for any answer!

도움이 되었습니까?

해결책

Not all implementations of java.util.List interface support addAll() method. For example, the one that is returned by Arrays.asList() does not and this is the method used by StructuredSelection.toList().

다른 팁

It sounds like the exception is thrown from your content provider. Have you checked that your content provider actually accepts the List? What content provider do you use?

I found out a workaround, change the way to initialize input for viewer2 as follow:

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

Before I set NUll for input, and couldn't use method addAll() to add more objectes to tableviewer. Thanks all for your help. Best regards!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top