2017-08-18 49 views
0

我正在使用JTextPane在Java中创建带有语法高亮的文本编辑器。当我运行该程序时,我得到以下输出: https://www.dropbox.com/s/kkce9xvtriujizy/Output.JPG?dl=0JTextPane语法高亮偏移不正确

我希望每个HTML标记都会突出显示为粉红色,但是在几个标记之后它会开始突出显示错误的区域。

这里是高亮代码:

private void htmlHighlight() { 
    String textToScan; 
     textToScan = txtrEdit.getText(); 
     StyledDocument doc = txtrEdit.getStyledDocument(); 
     SimpleAttributeSet sas = new SimpleAttributeSet(); 
     while(textToScan.contains(">")) { 
      StyleConstants.setForeground(sas, new Color(0xEB13B1)); 
      StyleConstants.setBold(sas, true); 
      doc.setCharacterAttributes(textToScan.indexOf('<'), textToScan.indexOf('>'), sas, false); 
      StyleConstants.setForeground(sas, Color.BLACK); 
      StyleConstants.setBold(sas, false); 
      textToScan = textToScan.substring(textToScan.indexOf('>') + 1, textToScan.length()); 
     } 

} 

提前感谢!

回答

0

setCharacterAttributes的第二个参数是长度,而不是结束索引。

这给我们:

private void htmlHighlight() { 
    String textToScan; 
     textToScan = txtrEdit.getText(); 
     StyledDocument doc = txtrEdit.getStyledDocument(); 
     SimpleAttributeSet sas = new SimpleAttributeSet(); 
     while(textToScan.contains(">")) { 
      StyleConstants.setForeground(sas, new Color(0xEB13B1)); 
      StyleConstants.setBold(sas, true); 
      int start = textToScan.indexOf('<'); 
      int end = textToScan.indexOf('>')+1; 
      doc.setCharacterAttributes(start, end-start, sas, false); 
      textToScan = textToScan.substring(textToScan.indexOf('>') + 1, textToScan.length()); 
     } 

} 

UPDATE:

的字符串是一个问题,但如果没有它,还有一个偏移,可能是由于线路末端。所以,我已经找到了唯一的解决办法是重新创建一个新的文件:

try { 
    String textToScan; 
    textToScan = txtrEdit.getText(); 
    StyledDocument doc = new DefaultStyledDocument(); 
    SimpleAttributeSet sas = new SimpleAttributeSet(); 
    StyleConstants.setForeground(sas, new Color(0xEB13B1)); 
    StyleConstants.setBold(sas, true); 
    int end = 0; 
    while (true) { 
     int start = textToScan.indexOf('<', end); 
     if (start < 0) { 
      doc.insertString(end, textToScan.substring(end), null); 
      break; 
     } 
     doc.insertString(end, textToScan.substring(end, start), null); 
     end = textToScan.indexOf('>', start+1); 
     if (end < 0) { 
      doc.insertString(start, textToScan.substring(start), sas); 
      break; 
     } 
     ++end; 
     doc.insertString(start, textToScan.substring(start, end), sas); 
    } 
    txtrEdit.setStyledDocument(doc); 
} catch (BadLocationException ex) { 
    Logger.getLogger(MyDialog.class.getName()).log(Level.SEVERE, null, ex); 
} 
+0

想这一点,但现在我的新的输出看起来是这样的: – JPadley

+0

https://www.dropbox.com/s/eb0dicxur99cr0w/newOutput.JPG ?dl = 0 – JPadley

+0

@JPadley对,对不起。新的更新。 –