在 EditingSupport 中编辑 ComboBoxCellEditor

Posted

技术标签:

【中文标题】在 EditingSupport 中编辑 ComboBoxCellEditor【英文标题】:Editing ComboBoxCellEditor in EditingSupport 【发布时间】:2018-06-12 22:46:58 【问题描述】:

如果用户选择 " " 项目,我想让 ComboBoxCellEditor 可编辑。我尝试使用两个CellEditor,一个是TextCellEditor,一个是ComboBoxCellEditor。如果用户选择" " 项目,CellEditor 将切换到TextCellEditor。但它不起作用。因为comboIndex 有一个ArrayOutOfBoundException。谁能帮我修改我的代码?原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.viewers.ColumnViewer.triggerEditorActivationEvent(ColumnViewer.java:677) 在 org.eclipse.jface.viewers.ColumnViewer.handleMouseDown(ColumnViewer.java:652) 在 org.eclipse.jface.viewers.ColumnViewer.access$0(ColumnViewer.java:648) 在 org.eclipse.jface.viewers.ColumnViewer$1.mouseDown(ColumnViewer.java:97) 在 org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:193) 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86) 在 org.eclipse.swt.widgets.Display.sendEvent(Display.java:4428) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) 在 org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4238) 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3817) 在 org.eclipse.jface.window.Window.runEventLoop(Window.java:818) 在 org.eclipse.jface.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(ActionContributionItem.java:397) 在 org.eclipse.jface.action.ActionContributionItem$$Lambda$148/1073564434.handleEvent(未知来源) 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86) 在 org.eclipse.swt.widgets.Display.sendEvent(Display.java:4428) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) 在 org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4238) 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3817) 在 org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155) 在 org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) 在 org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1044) 在 org.eclipse.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.databinding.observable.Realm.runWithDefault(Realm.java:336) 在 org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594) 在 org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) 在 org.jkiss.dbeaver.core.application.DBeaverApplication.start(DBeaverApplication.java:160) 在 org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 在 org.eclipse.core.runtime.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) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653) 在 org.eclipse.equinox.launcher.Main.basicRun(Main.java:590) 在 org.eclipse.equinox.launcher.Main.run(Main.java:1499) 在 org.eclipse.equinox.launcher.Main.main(Main.java:1472)

【问题讨论】:

在哪里获得ArrayOutOfBoundException?向我们展示堆栈跟踪。 我更新了我的代码和堆栈跟踪。 第 77 行是哪一行?您正在对该行的边界之外的数组进行索引。做一些调试来找出原因。 我认为原因是我使用了ComboBoxCellEditor,当我编辑单元格时,Object userInputValue 将被强制转换为Integer 类型,这将是comboIndex。所以 comboIndex 超出了数组范围。如果我在组合框中选择“”项,我想编辑单元格。这可能吗? 对于可编辑的 ComboBoxCellEditor,我们可以使用新的 ComboBoxCellEditor 扩展旧的 ComboBoxCellEditor,并覆盖其 doSetValue() 方法和 doGetValue() 方法。这可以使 ComboBoxCellEditor 可编辑。 【参考方案1】:

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

所以要获得一个可编辑的ComboBoxCellEditor 就足以在setValue-方法中处理这个值:

@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);

【讨论】:

【参考方案2】:

对于可编辑的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;

【讨论】:

以上是关于在 EditingSupport 中编辑 ComboBoxCellEditor的主要内容,如果未能解决你的问题,请参考以下文章

东北育才 DAY2组合数取mod (comb)

`scipy.misc.comb` 比临时二项式计算快吗?

comb

Pentaho 水壶 - 获取所有单词组合

Sublime Text 3 中的 Sass + CSS3 + CSS Comb

枚举大小为k的子集