在 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的主要内容,如果未能解决你的问题,请参考以下文章