JTable - CellHighlight и RowHighlight проблема - PullRequest
0 голосов
/ 08 мая 2018

Я новичок в весне, пробуя разные варианты выбора строк и ячеек 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());
    }
}

1 Ответ

0 голосов
/ 08 мая 2018

Вы забыли установить соответствующий фон (и передний план для вашего рендерера). Вам нужно добавить следующую строку в вашем getTableCellRendererComponent методе

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;
}
...