Я хочу сделать 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
как" "
(в коде OPCellEditor
).