2015-12-15 2 views
1

Je travaille actuellement sur une application qui lit un gros texte et met en évidence une sous-chaîne spécifique à l'intérieur de ce texte. Et ça fonctionne un peu ...DefaultHighlightPainter continue de se décaler dans JTextPane

Mais il semble que (et je ne sais pas pourquoi) le highligt continue à se déplacer chaque fois qu'il met en évidence la chaîne.

public List<int[]> findString(String text) {   
    text = text.toLowerCase(); 

    List<int[]> highlightPositions = new ArrayList<int[]>(); 
    JTextPane pane = getTextPane(); 

    String paneText = pane.getText().toLowerCase(); 

    int end = 0; 
    while (paneText.indexOf(text, end) != -1) {   

     int start = paneText.indexOf(text, end); 
     end = start + text.length();   

     highlightPositions.add(new int[] {start, end});     
    } 

    try { 
     highlight(highlightPositions); 
    } catch (Exception ex) { 
    }  
return null; 
} 

ce qui est le code qui fait la réelle soulignant

public void highlight(List<int[]> highlightPositions) throws BadLocationException { 
    DefaultHighlighter.DefaultHighlightPainter highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 

    JTextPane textPane = getTextPane();  

    for (int[] position : highlightPositions) { 
     System.out.println("Highlight: " + position[0] + " : " + position[1]); 
     textPane.getHighlighter().addHighlight(position[0], position[1], highlightPainter); 

    } 
} 

Est-ce que quelqu'un sait comment résoudre ce problème?

EDIT: Voici à quoi cela ressemble lorsque j'essaie de mettre en évidence le mot "Device".

Highlighting output

+1

Qu'entendez-vous par * "le highligt continue de changer" *? De plus, lorsque j'essaie de reproduire cela, cela fonctionne pour moi - S'il vous plaît envisager de fournir un runnable [mcve]. –

+0

Je viens de mettre à jour mon poste avec une photo. Voilà à quoi cela ressemble lorsque j'essaie de mettre en évidence le mot "Device". – stackmonkey

Répondre

2
String paneText = pane.getText().toLowerCase(); 

Ne pas utiliser getText(). La méthode getText() renvoie la chaîne avec la chaîne de fin de ligne pour la plate-forme qui, dans le cas de Windows, est \r\n. Toutefois, le document ne stocke que \n pour la chaîne EOL, de sorte que vous ne disposez pas de décalages par ligne supplémentaire dans le document.

La solution consiste à utiliser:

String paneText = pane.getDocument().getText().toLowerCase(); 

Voir Text and New Lines pour des informations plus complètes sur le problème.

+0

A travaillé comme un charme, merci. – stackmonkey