2017-04-19 121 views
0

嗨,这个问题更具体。对于课程,我们必须制作某种图书馆程序。Java Swing:Jtable突出显示单元格中单词的一部分

我让我的列表显示在JTable中,并且实现了一个也使用JTable的搜索窗口......我做了一个自定义的CellRenderer来突出显示术语搜索包含在本书的代码或标题中。

我的问题是现在它大胆的整个词....是否有可能使它只有该词的大胆部分?

现在生病在这个类中也有一个函数,它给出了单元格值中搜索项的开始和结束的索引。 (在getSearchIndex(Object,String)下的类的最后找到它)

这里是一个屏幕,下面的渲染器(颜色是单独的)的代码。

Sorry this is in French

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; 

} 

}

预先感谢任何尖端或技巧。

回答

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>"); 
} 
+1

你可以只用'setText'直接在'DefaultTableCellRenderer',这将会是无需投第一 – MadProgrammer

+0

@MadProgrammer是,DefaultTableCellRenderer是它自己的组件同样的事情。在这方面,像'this.setFont'和'component.setFont'这样的一些OP的代码可能会有点令人惊讶的是相同的。 –

+0

但是'Component cellComponent = super.getTableCellRendererComponent'正在返回它自己的一个实例,所以'cellComponent == this'是'true':P,所以无论哪种情况它都可以工作,我只是懒惰;} – MadProgrammer