2017-04-19 5 views
0

안녕하세요.이 질문은 다소 구체적입니다. 수업을 위해 우리는 일종의 도서관 프로그램을 만들어야했습니다.자바 스윙 : Jtable 셀에있는 단어의 한 부분 만 강조 표시합니다.

JTable에 내 목록을 표시하고 Jive도 사용하는 검색 창을 구현했습니다 ... 제목 검색이 제목 또는 제목의 코드에 포함되어있을 때 사용자 지정 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

당신은 그냥 사용할 수있는'직접'DefaultTableCellRenderer'에, 처음 네,하는 DefaultTableCellRenderer는 자신의 구성 요소 @MadProgrammer – MadProgrammer

+0

입니다 캐스트 할 필요없이 같은 일이 될 것 setText'. 그 점에서'this.setFont'와'component.setFont'와 같은 일부 OP 코드는 놀라 울 정도로 똑같을 수도 있습니다. –

+0

그러나'Component cellComponent = super.getTableCellRendererComponent'는 자신의 인스턴스를 리턴하므로'cellComponent == this'는'true'입니다 : P, 어느 경우 에나 작동합니다, 저는 게으르다;) – MadProgrammer