Редактирование ComboBoxCellEditor в EditingSupport

Я хочу сделать 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);
    }

}

Трассировка стека показана ниже:

ComboBoxCellEditor сам по себе доступен для редактирования, так как он использует " " (точно CellEditor). Выделенный текст можно легко перезаписать. В этом случае TextCellEditor возвращает ComboBoxCellEditor как " " (в коде OP CellEditor).


person khunnie    schedule 03.01.2018    source источник
comment
Я обновил свой код и трассировку стека.   -  person greg-449    schedule 03.01.2018
comment
Какая строка является строкой 77? Вы индексируете массив за его пределами в этой строке. Выполните некоторую отладку, чтобы понять, почему.   -  person khunnie    schedule 03.01.2018
comment
Я думаю, причина в том, что я использовал ComboBoxCellEditor, и когда я редактирую ячейку, объект userInputValue будет преобразован в тип Integer, который будет comboIndex. Таким образом, comboIndex не привязан к массиву. Я хочу отредактировать ячейку, если выберу элемент в поле со списком. Это возможно?   -  person greg-449    schedule 03.01.2018
comment
Для редактируемого ComboBoxCellEditor мы можем использовать новый ComboBoxCellEditor, который расширяет старый и переопределяет его метод doSetValue () и метод doGetValue (). Это может сделать ComboBoxCellEditor доступным для редактирования.   -  person khunnie    schedule 03.01.2018
comment
java.lang.ArrayIndexOutOfBoundsException: -1 в com.highgo.admin.migrator.ui.SecondColEdittingSupport.setValue (SecondColEdittingSupport.java:77) в org.eclipse.jface.viewers.EditingSupport.SaveCueell (в EditingSupport.saveCueell) .eclipse.jface.viewers.ColumnViewerEditor.saveEditorValue (ColumnViewerEditor.java:433) в org.eclipse.jface.viewers.ColumnViewerEditor.applyEditorValue (ColumnViewerEditor.java:299) в or.j. .java: 416) в org.eclipse.jface.viewers.ColumnViewer.triggerEditorActivationEvent (ColumnViewer.java:677) в org.eclipse.jface.viewers.ColumnViewer.handleMouseDown (ColumnViewer.java:652) в orj. viewers.ColumnViewer.access $ 0 (ColumnViewer.java:648) в org.eclipse.jface.viewers.ColumnViewer $ 1.mouseDown (ColumnViewer.java:97) в org.eclipse.swt.widgets.TypedListener.handleEv ent (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.NavigatorAdvanceTool.java:46) в com.highgo.admin.NavigatorAdmin. .dbeaver.ui.ActionUtils $ 1.run (ActionUtils.java:267) в org.eclipse.jface.actio n.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.r (Неизвестный источник) на org.eclipse.core.databinding.observable.Realm.runWithDefault (Realm.java:336) на org.eclipse.ui.internal.Workbench.createAndRunWorkbe nch (Workbench.java:594) в org.eclipse.ui.PlatformUI.createAndRunWorkbench (PlatformUI.java:148) в org.jkiss.dbeaver.core.application.DBeaverApplication.start (DBeaverApplication.java:1ipse) в org. .equinox.internal.app.EclipseAppHandle.run (EclipseAppHandle.java:196) в org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication (EclipseAppLauncher.java:134) в org.ecliptime .adaptor.EclipseAppLauncher.start (EclipseAppLauncher.java:104) в org.eclipse.core.runtime.adaptor.EclipseStarter.run (EclipseStarter.java:388) в org.eclipse.core.runtime.adaptor.Eclipse. .java: 243) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (Неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (Неизвестный источник) в java.lang. 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)   -  person khunnie    schedule 04.01.2018


Ответы (2)


Итак, чтобы получить доступный для редактирования ComboBoxCellEditor, достаточно обработать это значение в setValue-методе:

Для редактируемого ComboBoxCellEditor мы можем использовать новый JFace Combo, который расширяет старый и отменяет его метод CCombo и метод setValue. Это может сделать -1 редактируемым.

@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);
}
person IQV    schedule 24.05.2018

Получает 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;
}
person khunnie    schedule 04.01.2018