Java Swing: Jtable выделяет ТОЛЬКО часть слова в ячейке

Привет, этот вопрос довольно специфичен. Для занятий нам нужно было сделать какую-то библиотечную программу.

Я сделал свой список, отображаемый в JTable, и реализовал окно поиска, которое также использует JTable... Я создал собственный CellRenderer для выделения, когда поиск по термину содержится в коде книги или названии.

Мой вопрос в том, что сейчас выделено жирным шрифтом ВСЁ слово.... можно ли выделить жирным шрифтом только часть этого слова?

прямо сейчас у меня также есть в этом классе функция, которая дает мне индексы начала и конца поискового запроса в значении ячейки. (найдите его в конце класса в разделе getSearchIndex(Object, String))

вот скрин и ниже код для рендерера (для цветов отдельно).

Извините, это на французском

import java.awt.Component;
import java.awt.Font;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

 class HighlightRenderer extends DefaultTableCellRenderer {

private static final long serialVersionUID = 1L;
String searched = "";

public HighlightRenderer(String search){
    super();

    if(search != null && search != "")
        searched = search;
    else searched = "";
}

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
    Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        if(searched.length() == 0){
            cellComponent.setFont(new Font(this.getFont().getName(), Font.PLAIN, this.getFont().getSize()));
        }

        else if(value.toString().toUpperCase().contains(searched.toUpperCase())){
            cellComponent.setFont(new Font(this.getFont().getFontName(), Font.BOLD, this.getFont().getSize()));
            int[] index = getSearchIndex(value, searched);
        }

    return cellComponent;
}

private int[] getSearchIndex(Object value, String search){

    int searchLength = search.length();
    String key = (String) value;

    int[] retour = new int[2];
    retour[0] = -1;
    retour[1] = -1;

    for(int i = 0; i < key.length(); i++){
        if(key.substring(i, i+searchLength).equalsIgnoreCase(search)){
            retour[0] = i;
            retour[1] = i + searchLength;
            return retour;
        }
    }
    return retour;

}

}

Заранее спасибо за любой совет или хитрость.


person Ronin825    schedule 19.04.2017    source источник


Ответы (1)


Текстовые компоненты могут иметь StyledDocument и части текста, отмеченные с помощью атрибутов цвета.

Немного дешевле использовать HTML. Любой текстовый компонент, например JLabel, который по умолчанию предлагает средство визуализации ячеек. HTML может быть очень частичным.

JLabel label = (JLabel) cellComponent; // Or new JLabel();
label.setText(
    "<html>An <span style='background-color: lightskyblue'>example</span> of HTML");

String highlight(String text, String sought) {
     text = StringEscapeUtils.escapeHTML4(text); // <, >
     sought = StringEscapeUtils.escapeHTML4(sought);
     return "<html>" + text.replace(sought, "<b>" + sought + "</b>");
}
person Joop Eggen    schedule 19.04.2017
comment
Вы могли бы просто использовать setText непосредственно на DefaultTableCellRenderer, это было бы то же самое, без необходимости предварительного приведения - person MadProgrammer; 20.04.2017
comment
@MadProgrammer да, DefaultTableCellRenderer — это отдельный компонент. В этом отношении некоторый код OP, такой как this.setFont и component.setFont, может действовать немного удивительно, будучи одинаковым. - person Joop Eggen; 20.04.2017
comment
Но Component cellComponent = super.getTableCellRendererComponent возвращает экземпляр самого себя, поэтому cellComponent == this это true :P, так что в любом случае это сработает, я просто ленив;) - person MadProgrammer; 20.04.2017
comment
HTML, кажется, не работает .... также StringEscapeUtils, вероятно, нуждается в некотором импорте, который я не могу найти .... Google не может помочь, либо у меня нет необходимых библиотек - person Ronin825; 20.04.2017
comment
@ Ronin825, что ты на самом деле сделал? Я пытался добавить завершающий тег ‹/html›, но даже в этом случае он не работает. - person devoured elysium; 12.06.2018
comment
@devoured elysium Я давно закрыл это задание. Но позвольте мне проверить мой код, и я вернусь к вам! - person Ronin825; 12.06.2018