Java JTable-单元格突出显示和行突出显示问题

Java JTable-单元格突出显示和行突出显示问题,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我是spring新手,正在尝试JTable行和单元格选择的不同选项。坚持这个问题 我有一个简单的JTable,记录很少,添加了CellHighlight功能(来自stackoverflow),它工作得很好。但添加此选项后,行选择高亮显示不会发生 请说明我遗漏了什么 例如: import com.log.spark.QueryParams; import org.apache.commons.lang3.StringUtils; import javax.swing.*; import java

我是spring新手,正在尝试JTable行和单元格选择的不同选项。坚持这个问题

我有一个简单的JTable,记录很少,添加了CellHighlight功能(来自stackoverflow),它工作得很好。但添加此选项后,行选择高亮显示不会发生

请说明我遗漏了什么

例如:

import com.log.spark.QueryParams;
import org.apache.commons.lang3.StringUtils;

import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.DefaultHighlighter;
import java.awt.*;

public class TableExample {
    JFrame f;

    TableExample() {
        f = new JFrame();
        String data[][] = {{"101", "Amit", "670000"},
                {"102", "Jai", "780000"},
                {"101", "Sachin", "700000"}};
        String column[] = {"ID", "NAME", "SALARY"};
        JTable jt = new JTable(data, column);
        jt.setBounds(30, 40, 200, 300);
        JScrollPane sp = new JScrollPane(jt);

        jt.setDefaultRenderer(Object.class, new CellHighlightRenderer());

        f.add(sp);
        f.setSize(300, 400);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        new TableExample();
    }
}

class CellHighlightRenderer extends JTextField implements TableCellRenderer {

    public DefaultHighlighter high = new DefaultHighlighter();
    private QueryParams params = QueryParams.getInstance();

    public DefaultHighlighter.DefaultHighlightPainter highlight_painter
            = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);

    public CellHighlightRenderer() {
        setBorder(BorderFactory.createEmptyBorder());
        setHighlighter(high);
    }

    public Component getTableCellRendererComponent(JTable table,
                                                   Object value, boolean isSelected,
                                                   boolean hasFocus, int row,
                                                   int column) {

        setFont(table.getFont());
        setValue(value);

        int pos = 0;

        String pattern = params.getHighlightTxt();

        //if (len > last) {
        if (StringUtils.isNotBlank(pattern) && !pattern.equals("search message")) {
            while ((pos = value.toString().indexOf(pattern, pos)) >= 0) {
                try {
                    //high.addHighlight(first, last, highlight_painter);
                    high.addHighlight(pos, pos + pattern.length(), highlight_painter);
                    pos += pattern.length();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return this;
    }


    protected void setValue(Object value) {
        setText((value == null) ? "" : value.toString());
    }
}

您忘记了为渲染器设置适当的背景(和前景)。您需要在
getTableCellRenderComponent
方法中添加以下行

public Component getTableCellRendererComponent(JTable table,
                                               Object value, boolean isSelected,
                                               boolean hasFocus, int row,
                                               int column) {

    // need to be added
    setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
    setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
    //-------------
    setFont(table.getFont());
    setValue(value);

    int pos = 0;

    String pattern = params.getHighlightTxt();

    //if (len > last) {
    if (StringUtils.isNotBlank(pattern) && !pattern.equals("search message")) {
        while ((pos = value.toString().indexOf(pattern, pos)) >= 0) {
            try {
                //high.addHighlight(first, last, highlight_painter);
                high.addHighlight(pos, pos + pattern.length(), highlight_painter);
                pos += pattern.length();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return this;
}