有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当谓词发生变化时,如何更新彩色荧光笔(swingx)

我有一个名为ErrorHighlighter的类,它会在名为errorString的属性发生更改时收到通知。基于这个propertychangeevent,我更新了HighLighterPredicate,以突出显示带有红色背景的特定行

ErrorHighlighter收到propertychangeevent,它也会更改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) 个答案

  1. # 1 楼答案

    这看起来是我的错误。这种方法是可行的。getIndexForNodeData()通过对底层树数据结构进行预排序遍历,实际返回行的索引。这包括jxtreetable上未显示的根节点。因此我需要从索引中减去1

    int indexForNodeData = treeTable.getIndexForNodeData(modelData)-1; 
    

    这为我解决了问题。如果有人想看一个彩色荧光灯和属性更改侦听器的例子,我将离开这篇文章,而不是删除它