2014-10-08 65 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事件,將通過您的監聽器觸發被抓......等等