首页 文章

在EditingSupport中编辑ComboBoxCellEditor

提问于
浏览
0

如果用户选择 " " 项目,我想使 ComboBoxCellEditor 可编辑 . 我试着用两个 CellEditor ,一个是 TextCellEditor ,一个是 ComboBoxCellEditor . 如果用户选择 " " item, CellEditor 将切换到 TextCellEditor . 但它不起作用 . 因为 comboIndexArrayOutOfBoundException . 任何人都可以帮我修改我的代码吗?原始 EditingSupport 的代码如下所示:

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;

public class SecondColEdittingSupport extends EditingSupport {
    private final TableViewer viewer;
    private final CellEditor comboEditor;
    private final CellEditor textEditor;
    Logger logger = Logger.getLogger(this.getClass());
    public static String[] names ={ " ","SMALLINT ", "INTEGER", "BIGINT", 
    "DECIMAL", "NUMERIC", 
            "REAL", "TIMESTAMP", "VARCHAR", "CHAR", "TEXT"};

    public SecondColEdittingSupport(TableViewer viewer) {
        super(viewer);
        this.viewer = viewer;
        comboEditor = new ComboBoxCellEditor(viewer.getTable(), names);
        textEditor = new TextCellEditor(viewer.getTable());
    }

    private int getNameIndex(String name) {
        for (int i = 1; i < SecondColEdittingSupport.names.length; i++) {
            if (SecondColEdittingSupport.names[i].equals(name))
                return i;
        }
        return 0;
    }

    @Override
    protected CellEditor getCellEditor(Object element) {
        String[] str = (String[]) element;
        if (getNameIndex(str[1]) != 0) {
            return comboEditor;
        }
        return textEditor;
    }

    @Override
    protected boolean canEdit(Object element) {
        return true;
    }

    @Override
    protected Object getValue(Object element) {
        String[] str = (String[]) element;
        if (getNameIndex(str[1]) != 0) {
            return getNameIndex(str[1]);
        }
        return  str[1];
    }

    @Override
    protected void setValue(Object element, Object userInputValue) {
        String[] str = (String[]) element;
        if (getNameIndex(str[1]) != 0) {
            Integer comboIndex = (Integer) userInputValue;
            str[1] = SecondColEdittingSupport.names[comboIndex];
        } else {
            str[1] = String.valueOf(userInputValue);
        }
        viewer.update(element, null);
    }

}

堆栈跟踪如下所示:

java.lang.ArrayIndexOutOfBoundsException:-1在com.highgo.admin.migrator.ui.SecondColEdittingSupport.setValue(SecondColEdittingSupport.java:77)在org.eclipse.jface.viewers.EditingSupport.saveCellEditorValue(EditingSupport.java:113)在org.eclipse.jface.viewers.ColumnViewerEditor.saveEditorValue(ColumnViewerEditor.java:433)在org.eclipse.jface.viewers.ColumnViewerEditor.applyEditorValue(ColumnViewerEditor.java:299)在org.eclipse.jface.viewers.ColumnViewerEditor.handleEditorActivationEvent( ColumnViewerEditor.java:416)位于org.eclipse.jface上的org.eclipse.jers.view.ColumnView.handleMouseDown(ColumnViewer.java:652)的org.eclipse.jface.viewers.ColumnViewer.triggerEditorActivationEvent(ColumnViewer.java:677) .viewers.ColumnViewer.access $ 0(ColumnViewer.java:648)atg.eclipse.jface.viewers.ColumnViewer $ 1.mouseDown(ColumnViewer.java:97)at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java) :193)在org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)at Org.eclipse.swt.wts.wtis.Andplay.sendEvent(dob.::::: or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or Display.java:4238)org.eclipse.wt.jidget.Display.readAndDispatch(Display.java:3817)位于org.eclipse.jface的org.eclipse.jface.window.Window.runEventLoop(Window.java:818) .window.Window.open(Window.java:794)在com.highgo.admin.migrator.handler.OpenMigratorHandler.execute(OpenMigratorHandler.java:28)在com.highgo.admin.NavigatorActionExecuteAdvanceTool.executeTool(NavigatorActionExecuteAdvanceTool.java:46 )在com.highgo.admin.NavigatorActionExecuteAdvanceTool.run(NavigatorActionExecuteAdvanceTool.java:37)在org.jkiss.dbeaver.ui.ActionUtils $ 1.run(ActionUtils.java:267)在org.eclipse.jface.action.Action.runWithEvent (Action.java:473)org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565)org.eclipse.jface.action.ActionContributionItem.lambda $ 4(ActionContrib) utionItem.java:397)org.eclipse.jface.action.ActionContributionItem $$ Lambda $ 148 / 1073564434.handleEvent(未知来源)org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)at org . eclipse.swt.widgets.Display.sendEvent(Display.java:4428)atg.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)org.eclipse.swt.widgets.Display.runDeferredEvents(显示 . java:4238)org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3817)at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine $ 5.run(PartRenderingEngine.java:1155)at at Org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)位于org.eclipse的org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1044) . e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)org.eclipse.ui.internal.Workbench.lambda $ 3(Workbench.java:680)org.eclipse.ui.internal.Workbench $$ lambda $ 14 / 1717433286.run(未知来源)org.eclipse.core.databind ing.observable.Realm.runWithDefault(Realm.java:336)在org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594)在org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)在org.eclipse.core.run上的org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)的org.jkiss.dbeaver.core.application.DBeaverApplication.start(DBeaverApplication.java:160) .internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)在org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)在org.eclipse.core.runtime.adaptor.EclipseStarter .run(EclipseStarter.java:388)atg.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke来自org.ecl的java.lang.reflect.Method.invoke(未知来源)的sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)的(未知来源)位于org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)的org.eclipse.equinox.launcher.Main.run上的ipse.equinox.launcher.Main.invokeFramework(Main.java:653) java:1499)org.eclipse.equinox.launcher.Main.main(Main.java:1472)

2 回答

  • 0

    对于可编辑的 ComboBoxCellEditor ,我们可以使用新的 ComboBoxCellEditor 扩展旧的,并覆盖其 doSetValue() 方法和 doGetValue() 方法 . 这可以使 ComboBoxCellEditor 可编辑 .

    protected void doSetValue(final Object value) {
        if (value instanceof String) {
            ((CCombo) getControl()).setText((String) value);
        } else {
            super.doSetValue(value);
        }
    }
    
    @Override
    protected Object doGetValue() {
        final Object value = super.doGetValue();
        if (value instanceof Integer && (Integer) value == -1) {
            return ((CCombo) getControl()).getText();
        }
        return value;
    }
    
  • 0

    ComboBoxCellEditor 本身是可编辑的,因为它使用 JFace Combo (完全是 CCombo ) . 可以轻松覆盖所选文本 . 在这种情况下, setValue 返回 -1value (在OP的代码 userInputValue 中) .

    因此,要获得可编辑的 ComboBoxCellEditor 就足以在 setValue -method中处理此值:

    @Override
    protected void setValue(Object element, Object value) {
        if ((int)value == -1) {
            str[1] = ((CCombo)editor.getControl()).getText();
        } else {
            str[1] = names[(int)value];
        }
        viewer.update(element, null);
    }
    

相关问题