2013-06-01 4 views
0

У меня есть класс ErrorHighlighter, который получает уведомление в любое время, когда изменяется свойство с именем errorString. Основываясь на этом свойстве changeevent, я обновляю HighLighterPredicate, чтобы выделить определенную строку с красным фоном.Как обновить ColourHighlighter (swingx) при изменении предиката

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 и слушателя изменений свойств.

Смежные вопросы