渲染器在筛选器之后,行不再突出显示



我的方法中有以下渲染器和工具提示

tableR = new JTable(modelR)
{
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        Font myFont = new Font("Arial",Font.PLAIN,10);
        Font myFont1 = new Font("Arial", Font.BOLD,10);
        if (!isRowSelected(row)) {
            if (tableR.getColumnCount() >= 0) {
                String type = (String) getModel().getValueAt(row, 11);
                c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
                c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
                c.setFont("0.0".equals(type) ? myFont1: myFont);
            }
        }  
        return c;
    }
    @Override
    public String getToolTipText(MouseEvent e) {
        String tip = null;
        java.awt.Point p = e.getPoint();
        int rowIndex = rowAtPoint(p);
        int colIndex = columnAtPoint(p);
        int realColumnIndex = convertColumnIndexToModel(colIndex);
        if (realColumnIndex != 20) { //Sport column
            tip = " " + getValueAt(rowIndex, colIndex);
            //tip = super.getToolTipText(e);
        }
        return tip;
    }
};

这在每次刷新方法后应用,每 10 秒发生一次。

我在表上还有一个过滤器侦听器方法,其形式为:

 private void filter2method() {
    filterR.getDocument().addDocumentListener(new DocumentListener() {
    @Override
    public void insertUpdate(DocumentEvent e) {
newFilter();
    }
    @Override
    public void removeUpdate(DocumentEvent e) {
    newFilter();
    }
    @Override
    public void changedUpdate(DocumentEvent e) {
newFilter();
    }
    private void newFilter() {
    RowFilter <DefaultTableModel, Object>rf =null;
   try {
        rf = RowFilter.regexFilter(filterR.getText(),2);
    } catch (java.util.regex.PatternSyntaxException e) {
        return;
    }
    sorter.setRowFilter(rf);

    } }
    );
    }

但是,在过滤我的表时,渲染器不再以红色突出显示正确的行。即 0.0 的那些

我该如何处理?我是否需要删除渲染器,然后重新应用它?我是否需要将我的渲染器方法合并到过滤器方法中。帮助赞赏。

渲染器报告视图索引,而不是模型索引。您正在使用视图索引来索引语句中的模型String type = (String) getModel().getValueAt(row, 11);

设置颜色的 if 语句应为:

int rowModelId = convertRowIndexToModel( row );
if (!isRowSelected(row)) {
    if (tableR.getColumnCount() >= 0) {
        String type = (String) getModel().getValueAt(rowModelId , 11);
        c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
        c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
        c.setFont("0.0".equals(type) ? myFont1: myFont);
     }
}  

您也可以编写它以使用 JTable.getValueAt 获取单元格值(此方法采用视图索引),以避免必须使用 convertRowIndexToModel 方法,如下所示:

if (!isRowSelected(row)) {
    if (tableR.getColumnCount() >= 0) {
        String type = (String) getValueAt(row, 11);
        c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
        c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
        c.setFont("0.0".equals(type) ? myFont1: myFont);
    }
}  

最新更新