2017-04-19 12 views
0

こんにちは、この質問はかなり具体的です。授業では何らかの図書館プログラムを作らなければなりませんでした。Java Swing:Jtableセル内の単語の一部のみを強調表示

JTableに表示されたリストを作成し、JTableを使用する検索ウィンドウを実装しました。カスタム検索のCellRendererを、ブックまたはタイトルのコードに用語検索が含まれているときにハイライト表示しました。

私の質問は今、それは全世界を大胆にしています....それはその言葉の大胆な部分だけにすることは可能ですか?

今、このクラスには、セルの値に検索用語の開始と終了のインデックスを与える関数もあります。

レンダラーのコードとスクリーンの下に表示されます(色は別です)。任意のヒントやトリックを事前に

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

あなただけの ''直接DefaultTableCellRenderer'に、それはそう、DefaultTableCellRendererは、独自のコンポーネントである@MadProgrammer – MadProgrammer

+0

最初にキャストする必要がなく、同じことになると思いsetText'使用することができます。その点で、 'this.setFont'や' component.setFont'のようなOPのコードのいくつかは、意外にも同じであるかもしれません。 –

+0

しかし 'Component cellComponent = super.getTableCellRendererComponent'はそれ自身のインスタンスを返していますので、' cellComponent == this'は 'true'です:P、どちらの場合でもうまくいくでしょう、私はちょっと怠けた;) – MadProgrammer

関連する問題