2014-10-08 67 views
0

我正在使用eclipse插件。我在eclipse插件上创建了一个扩展点。我已经添加了一个下拉列表。所以我实现了一个监听器来知道值何时改变并执行我的逻辑。扩展点,这里的片段:Eclipse SWT java.lang.StackOverflowError:为什么我的侦听器执行很多次?

<extension point="org.eclipse.ui.views.properties.tabbed.propertyTabs"> 
     <propertyTabs contributorId="com.ibm.xtools.modeler.ui.properties"> 
      <propertyTab 
       label="My new Label" 
       category="Core" 
       afterTab="modeleditor.property.tab.AdvancedTab" 
       id="com.test.plugin.tabs.MyNewTab"/> 
     </propertyTabs> 
    </extension> 
    <extension point="org.eclipse.ui.views.properties.tabbed.propertySections"> 
     <propertySections contributorId="com.ibm.xtools.modeler.ui.properties"> 
      <propertySection 
       class="com.test.plugin.sections.MyNewTabSection" 
       tab="com.test.plugin.tabs.MyNewTab" 
       filter="com.test.plugin.sections.MyNewTabSection$Filter" 
       id="com.bnpp.ism.test.profile.tabs.MyNewTab"> 
      </propertySection> 
     </propertySections> 
    </extension> 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import org.eclipse.emf.ecore.EObject; 
import org.eclipse.jface.viewers.ArrayContentProvider; 
import org.eclipse.jface.viewers.ComboViewer; 
import org.eclipse.jface.viewers.ISelectionChangedListener; 
import org.eclipse.jface.viewers.IStructuredSelection; 
import org.eclipse.jface.viewers.SelectionChangedEvent; 
import org.eclipse.jface.viewers.StructuredSelection; 
import org.eclipse.swt.events.ModifyEvent; 
import org.eclipse.swt.events.ModifyListener; 
import org.eclipse.swt.layout.FormAttachment; 
import org.eclipse.swt.layout.FormData; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; 
import org.eclipse.uml2.uml.Enumeration; 
import org.eclipse.uml2.uml.NamedElement; 

public class MyNewTabSection extends SuperSection{ 

    private ComboViewer comboViewer; 
    private ISelectionChangedListener comboViewerSelectionListener; 
    private Label myLabel; 
    private final static List<String> myValues = new ArrayList<String>(Arrays.asList("FIRST","TWO","THREE")); 
    public static class Filter extends AbstractFilter{ 

    public Filter() { 
     super(); 
    } 
} 

    @Override 
    public void createControls(Composite parent,TabbedPropertySheetPage tabbedPropertySheetPage) { 
     super.createControls(parent,tabbedPropertySheetPage); 
     addLabel(); 
     addComboViewer(); 

    @Override 
    protected void addListeners() { 
     comboViewer.addSelectionChangedListener(getComboViewerSelectionListener()); 
    } 

    @Override 
    protected void removeListeners() { 
     comboViewer.removeSelectionChangedListener(getComboViewerSelectionListener()); 
    } 

    @Override 
    protected boolean acceptElement(EObject element) { 
     return element instanceof Enumeration; 
    } 

    private void addComboViewer() { 

     FormData data; 
     comboViewer = new ComboViewer(composite); 
     data = new FormData(); 
     data.left = new FormAttachment(myLabel,10); 
     data.top = new FormAttachment(15,110); 
     comboViewer.getCombo().setText("           "); 
     comboViewer.getCombo().setLayoutData(data); 
     comboViewer.setContentProvider(new ArrayContentProvider()); 
     comboViewer.setInput(myValues); 

    } 

    private void addReferenceTypeCombo() { 

     FormData data; 
     comboViewer = new ComboViewer(composite); 
     data = new FormData(); 
     data.left = new FormAttachment(myLabel,10);// 10,110 
     data.width = 100; 
     data.top = new FormAttachment(15,110); 
     comboViewer.getCombo().setText("           "); 
     comboViewer.getCombo().setLayoutData(data); 
     comboViewer.setContentProvider(new ArrayContentProvider()); 
     NomenclatureTypeView[] values = NomenclatureTypeView.values(); 
     comboViewer.setInput(myValues); 

    } 

    private void addLabel() { 
     FormData data; 
     nomenclatureLabel = new Label(composite,0); 
     data = new FormData(); 
     data.left = new FormAttachment(10,110); 
     data.top = new FormAttachment(15,110); 
     myLabel.setLayoutData(data); 
     myLabel.setBackground(white); 
     myLabel.setText("My Label text"); 
    } 


    private ISelectionChangedListener getComboViewerSelectionListener() { 

     if (comboViewerSelectionListener == null) { 

      comboViewerSelectionListener = new ISelectionChangedListener(){ 

       @Override 
       public void selectionChanged(SelectionChangedEvent event) { 

        IStructuredSelection selection = (IStructuredSelection) event.getSelection(); 
        Object firstElement = selection.getFirstElement(); 
        final String value = firstElement.toString(); 
        Object firstElementA = comboViewer.getElementAt(0); 
        if (firstElement != null) { 
         comboViewer.setSelection(new StructuredSelection(firstElement)); 
        } 

        // some logic 
       } 
      }; 
     } 
     return comboViewerSelectionListener; 
    } 


    @Override 
    protected void initInternalInput(EObject element) { 
     this.element = (NamedElement) element; 

    } 

    @Override 
    protected void resetInternalInput() { 
     this.element = null; 
    } 
} 

当我点击选项卡,我可以看到我的价值(一,二,三)下拉列表。但是,当我选择列表的值时,监听器会多次运行。这很奇怪,因为我只是选择了一次价值。 它运行监听器代码多次,直到有以下异常:

!MESSAGE Unhandled event loop exception 
!STACK 0 
java.lang.StackOverflowError 
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:3877) 
    at org.eclipse.swt.widgets.Combo.windowProc(Combo.java:2058) 
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4545) 
    at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method) 
    at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3012) 
    at org.eclipse.swt.widgets.Combo.select(Combo.java:1386) 
    at org.eclipse.jface.viewers.ComboViewer.listSetSelection(ComboViewer.java:212) 
    at org.eclipse.jface.viewers.AbstractListViewer.setSelectionToWidget(AbstractListViewer.java:513) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelectionToWidget(StructuredViewer.java:1680) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1636) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.myNewTabSection$2.selectionChanged(myNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) 
    at org.eclipse.core.runtime.Platform.run(Platform.java:880) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:48) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:160) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2062) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1638) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:392) 
    at com.test.plugin.sections.MyNewTabSection$2.selectionChanged(MyNewTabSection.java:178) 
    at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:162) 
+2

当然'你的侦听器中的comboViewer.setSelection'触发一个'SelectionChange'事件,它将被你的侦听器触发......这样触发......等等 – 2014-10-08 09:40:24

+0

太棒了!谢谢。你能写答案,所以我会打勾正确? – Pracede 2014-10-08 09:45:27

回答

1

在你的听众当然comboViewer.setSelection触发SelectionChange事件,将通过您的监听器触发被抓......等等