2012-07-15 83 views
0

我有一个奇怪的问题(至少它看起来这样),当在textPane中搜索一个字符串,我得到一个额外的索引每个行号搜索和当使用StyledDoc经文只是从textPane获取文本时返回。我从同一个窗格中获取相同的文本,只是一个来自纯文本,另一个来自样式文档。我在这里错过了什么。我将尽力列出我正在使用的两个版本之间的许多变化。StyledDocument增加额外的计数indexof文件的每一行

的纯文本版本:

public int displayXMLFile(String path, int target){ 
    InputStreamReader inputStream; 
    FileInputStream fileStream; 
    BufferedReader buffReader; 

    if(target == 1){ 

     try{     
      File file = new File(path); 
      fileStream = new FileInputStream(file); 
      inputStream = new InputStreamReader(fileStream,"UTF-8"); 
      buffReader = new BufferedReader(inputStream); 
      StringBuffer content = new StringBuffer(""); 
      String line = ""; 
      while((line = buffReader.readLine())!=null){ 
       content.append(line+"\n"); 
      } 
      buffReader.close(); 
      xhw.txtDisplay_1.setText(content.toString()); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
      return -1; 
     } 
    } 
} 

诗句风格化文件(没有应用的样式)

protected void openFile(String path, StyledDocument sDoc, int target) 
       throws BadLocationException { 

    FileInputStream fileStream; 
    String file; 
    if(target == 1){ 
     file = "Openning First File"; 
    } else { 
     file = "Openning Second File"; 
    } 


    try { 
     fileStream = new FileInputStream(path); 

     // Get the object of DataInputStream 
     //DataInputStream in = new DataInputStream(fileStream); 

     ProgressMonitorInputStream in = new ProgressMonitorInputStream(
       xw.getContentPane(), file, fileStream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 

     //Read File Line By Line 
     while ((strLine = br.readLine()) != null) {     
      sDoc.insertString(sDoc.getLength(), strLine + "\n", sDoc.getStyle("regular")); 
     xw.updateProgress(target); 
     } 

     //Close the input stream 
     in.close(); 
    } catch (Exception e){//Catch exception if any 
     System.err.println("Error: " + e.getMessage()); 
    } 

这是我如何搜索:

public int searchText(int sPos, int target) throws BadLocationException{ 

    String search = xhw.textSearch.getText(); 
    String contents; 
    JTextPane searchPane; 

    if(target == 1){ 
     searchPane = xhw.txtDisplay_1;    
    } else { 
     searchPane = xhw.txtDisplay_2; 
    } 

    if(xhw.textSearch.getText().isEmpty()){ 
     xhw.displayDialog("Nothing to search for"); 
     highlight(searchPane, null, 0,0); 
    } else { 


     contents = searchPane.getText(); 

     // Search for the desired string starting at cursor position 
     int newPos = contents.indexOf(search, sPos); 

     // cycle cursor to beginning of doc window 
     if (newPos == -1 && sPos > 0){ 
      sPos = 0; 
      newPos = contents.indexOf(search, sPos); 
     } 

     if (newPos >= 0) { 
      // Select occurrence if found 

      highlight(searchPane, contents, newPos, target); 

      sPos = newPos + search.length()+1; 
     } else { 
      xhw.displayDialog("\"" + search + "\"" + " was not found in File " + target); 
     } 
    } 
    return sPos; 
} 

示例文件:

<?xml version="1.0" encoding="UTF-8"?> 
<AlternateDepartureRoutes> 
    <AlternateDepartureRoute> 
    <AdrName>BOIRR</AdrName> 
    <AdrRouteAlpha>..BROPH..</AdrRouteAlpha> 
    <TransitionFix> 
     <FixName>BROPH</FixName> 
    </TransitionFix> 
    </AlternateDepartureRoute> 
    <AlternateDepartureRoute> 
</AlternateDepartureRoutes> 

我的荧光笔:

public void highlight(JTextPane tPane, String text, int position, int target) throws BadLocationException { 
    Highlighter highlighter = new DefaultHighlighter(); 
    Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.LIGHT_GRAY); 
    tPane.setHighlighter(highlighter); 

    String searchText = xhw.textSearch.getText(); 
    String document = tPane.getText(); 
    int startOfSString = document.indexOf(searchText,position); 

    if(startOfSString >= 0){ 
     int endOfSString = startOfSString + searchText.length(); 
     highlighter.addHighlight(startOfSString, endOfSString, painter); 
     tPane.setCaretPosition(endOfSString); 
     int caretPos = tPane.getCaretPosition(); 
     javax.swing.text.Element root = tPane.getDocument().getDefaultRootElement(); 
     int lineNum = root.getElementIndex(caretPos) +1; 
     if (target == 1){ 
      xhw.txtLineNum1.setText(Integer.toString(lineNum)); 
     } else if (target == 2){ 
      xhw.txtLineNum2.setText(Integer.toString(lineNum)); 
     } else { 
      xhw.txtLineNum1.setText(null); 
      xhw.txtLineNum2.setText(null); 
     } 

    } else { 
     highlighter.removeAllHighlights(); 
    } 

} 

当我做Alt键搜索用的indexOf()我得到40的纯文本(这是它应该返回什么)和41与风格的文档搜索时。对于Alt出现在我得到的每一个额外的行以及额外的索引(以便indexof()调用在第3行中返回2以上)。这发生在找到的每一条附加线上。我错过了明显的东西吗? (如果我需要将它推送到一个较小的单个类,以便于检查,那么稍后我可以做更多的时间)。

在此先感谢...

回答

0

好的我找到了一个解决方案(基本上)。我走近这个从我得到来自两种不同的方式相同的文本文字及部件方面......

String search = xw.textSearch.getText(); 
    String contents; 
    String contentsS; 
    JTextPane searchPane; 
    StyledDocument sSearchPane; 

    searchPane = xw.txtDisplay_left; 
    sSearchPane = xw.txtDisplay_left.getStyledDocument(); 


    contents = searchPane.getText(); 
    contentsS = sSearchPane.getText(0, sSearchPane.getLength()); 

    // Search for the desired string starting at cursor position 
    int newPos = contents.indexOf(search, sPos); 
    int newPosS = contentsS.indexOf(search, sPos); 

所以比较两个变量“newPos” &“newPosS”时,newPos retruned 1更多的则newPosS用于搜索字符串的每一行。因此,当查看示例文件并搜索“Alt”时,第一个实例在第2行中找到。“newPos”返回41,“newPosS返回40(然后突出显示正确的文本)。下一个发生(在行中找到3)“newPos”返回71,“newPosS”返回69.正如你所看到的,每一条新线都会增加计数的起始位置。我会怀疑每个新行都会增加一个额外的字符从

是不存在的StyledDoc的textPane。我敢肯定有一个合理的解释,但我没有它在这个时候。

1

如果您使用的是Windows,那么TextComponent中的文本( searchPane.getText())可以包含回车+换行符(\ r \ n),但TextComponent的样式文档(sSearchPane.getText(0,sSearchPane.getLength()))仅包含换行符(\ n)。这就是为什么你的newPos总是大于newPosS的那个点的换行次数。为了解决这个问题,在你的搜索功能,您可以更改:

contents = searchPane.getText(); 

到:

contents = searchPane.getText().replaceAll("\r\n","\n"); 

搜索与该样式化文档使用相同的指标出现这样。