Component (JTable table, Object value, boolean isSelected, int row, int column) { int modelRow = myTable.convertRowIndexToModel(row); Pair<Object, T> pair = myModel.data.get(modelRow); Object target = pair.first; editorValue = pair.second; // (T)value if (!canEditTarget(target, editorValue)) return null; JPanel panel = createActionPanel(target, new Value<>() { @Override public T get() { return editorValue; } @Override public void set(T value) { editorValue = adjustChosenValue(target, value); } @Override public void commit() { TableUtil.stopEditing(myTable); selectRows(new int[]{modelRow}, true); if (Comparing.equal(editorValue, pair.second)) { // do nothing } else { int ret = clearSubdirectoriesOnDemandOrCancel(false, target); if (ret == Messages.CANCEL) { myModel.setValueAt(value, modelRow, column); } selectRows(new int[]{modelRow}, true); } } }, true); return panel; }