Как обновить ColourHighlighter (swingx), когда предикат изменился
У меня есть класс с именем ErrorHighlighter, который получает уведомление каждый раз, когда изменяется свойство с именем errorString. Основываясь на этом свойстве changeevent, я обновляю HighLighterPredicate, чтобы выделить конкретную строку красным фоном.
ErrorHighlighter получает свойство changeevent, оно также меняет HighlighterPredicate, но строка таблицы не обновляется красным фоном.
Я также обновляю подсказку строки. Это тоже не отражается.
Пожалуйста, смотрите код ниже. Может ли кто-нибудь помочь, пожалуйста?
public class ErrorRowHighlighter extends ColorHighlighter implements PropertyChangeListener {
private Map<Integer, String> rowsInError;
private SwingObjTreeTable<ShareholderHistoryTable> treeTable;
public ErrorRowHighlighter(SwingObjTreeTable<ShareholderHistoryTable> treeTable) {
super(CommonConstants.errorColor, null);
this.treeTable = treeTable;
rowsInError=new HashMap<Integer, String>();
setHighlightPredicate(new HighlightPredicate() {
@Override
public boolean isHighlighted(Component renderer, ComponentAdapter adapter) {
if(rowsInError.containsKey(adapter.row)){
return true;
}
return false;
}
});
this.treeTable.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
int row=ErrorRowHighlighter.this.treeTable.rowAtPoint(e.getPoint());
if(rowsInError.containsKey(row)){
ErrorRowHighlighter.this.treeTable.setToolTipText(rowsInError.get(row));
}else{
ErrorRowHighlighter.this.treeTable.setToolTipText(null);
}
}
});
}
public void highlightRowWithModelDataAsError(ShareholderHistoryTable modelData){
int indexForNodeData = treeTable.getIndexForNodeData(modelData);
if(indexForNodeData>-1){
rowsInError.put(indexForNodeData, modelData.getErrorString());
updateHighlighter();
}
}
public void unhighlightRowWithModelDataAsError(ShareholderHistoryTable modelData){
int indexForNodeData = treeTable.getIndexForNodeData(modelData);
if(indexForNodeData>-1){
rowsInError.remove(indexForNodeData);
updateHighlighter();
}
}
public void updateHighlighter(){
treeTable.removeHighlighter(this);
treeTable.addHighlighter(this);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
ShareholderHistoryTable sourceObject= (ShareholderHistoryTable) evt.getSource();
if(StringUtils.isNotEmpty(sourceObject.getErrorString())){
highlightRowWithModelDataAsError(sourceObject);
}else{
unhighlightRowWithModelDataAsError(sourceObject);
}
}
}
1 ответ
Это выглядит как ошибка с моей стороны. Метод treeTable.getIndexForNodeData() фактически возвращает обратно индекс строки, выполняя предварительный обход базовой структуры данных дерева. Это включает в себя корневой узел, который не отображается в jxtreetable. Следовательно мне нужно было минус 1 из индекса
int indexForNodeData = treeTable.getIndexForNodeData(modelData)-1;
Это решило проблему для меня. Я оставляю сообщение, а не удаляю его, если кто-то хочет взглянуть на пример ColorHighlighter и слушателя изменения свойства.