Java 渲染器在过滤器之后,行不再高亮显示

Java 渲染器在过滤器之后,行不再高亮显示,java,swing,jtable,tablecellrenderer,rowfilter,Java,Swing,Jtable,Tablecellrenderer,Rowfilter,我的方法中有以下渲染器和工具提示 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("

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

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);


    } }

    );
    }
private void filter2method(){
filterR.getDocument().addDocumentListener(新DocumentListener()){
@凌驾
公共作废插入更新(文档事件e){
newFilter();
}
@凌驾
公共作废移除更新(文档事件e){
newFilter();
}
@凌驾
公共作废更改日期(记录事件e){
newFilter();
}
私有void newFilter(){
RowFilter rf=null;
试一试{
rf=RowFilter.regexFilter(filterR.getText(),2);
}catch(java.util.regex.PatternSyntaxException e){
返回;
}
分拣机。设置行过滤器(rf);
} }
);
}
但是,在过滤我的表格时,渲染器不再以红色突出显示右侧行,即0.0的行

我该怎么处理?是否需要删除渲染器,然后重新应用它?
我是否需要将渲染器方法合并到过滤器方法中。。感谢帮助。

渲染器报告的是视图索引,而不是模型索引。您正在使用视图索引为语句
String type=(String)getModel()中的模型建立索引。getValueAt(第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);
     }
}  
您还可以编写它来使用(此方法获取视图索引)获取单元格值,以避免使用
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);
    }
}  

渲染器报告视图索引,而不是模型索引。您正在使用视图索引为语句
String type=(String)getModel()中的模型建立索引。getValueAt(第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);
     }
}  
您还可以编写它来使用(此方法获取视图索引)获取单元格值,以避免使用
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);
    }
}  

@TT渲染器工作正常,但问题是,在我将表作为文档侦听器进行筛选后,高亮显示不再高亮显示正确的行,因为该表现在的行更少。我需要突出显示以突出显示新过滤的内容table@MrAssistance首先让我问一下,你是否应用了我回答的两种版本,你是否在两种情况下都看到了相同的行为?@TT我没有,因为我认为问题不在这里——问题是在我输入过滤器后,它过滤表模型,然后高亮显示的行不再高亮显示正确的行。我想是因为高亮显示固定在当前表上。@TT嘿,猜猜我应用了你的方法,效果很好!!为什么???@MrAssistance这是我强调的代码中的一个明显错误。如果你不想听取专业人士的建议,那么为什么要问StackOverflow的问题呢?@TT渲染器工作得很好,但是问题是,在我作为文档侦听器筛选表之后,高亮显示不再高亮显示正确的行,因为表现在的行数较少。我需要突出显示以突出显示新过滤的内容table@MrAssistance首先让我问一下,你是否应用了我回答的两种版本,你是否在两种情况下都看到了相同的行为?@TT我没有,因为我认为问题不在这里——问题是在我输入过滤器后,它过滤表模型,然后高亮显示的行不再高亮显示正确的行。我想是因为高亮显示固定在当前表上。@TT嘿,猜猜我应用了你的方法,效果很好!!为什么???@MrAssistance这是我强调的代码中的一个明显错误。如果你不想听取专业人士的建议,那为什么要问StackOverflow的问题呢???