为什么我们需要一个偏移值

时间:2016-03-17 19:13:28

标签: java swing jtextpane

所以我的代码正在运行,可能不是最漂亮或最有效但现在它完成了工作。但是,我的问题是为什么我需要某些偏移值,比如我的某些函数的位置为+ 1,而我的行编号为+ 2.这些神奇的数字有点令人困惑,因为它们使程序工作为需要,但为什么他们这样做?我总共添加了这些+ 1,我理解它们的工作原理,但仍然没有对这些神奇数字进行具体解释。如果你能告诉我他们的重要性会很棒。以下是一些可供参考的代码。

private String getLineNumbersText()
{
    int counter = 0;
    int caretPosition = textArea.getDocument().getLength();
    Element root = textArea.getDocument().getDefaultRootElement();
    StringBuilder lineNumbersTextBuilder = new StringBuilder();
    lineNumbersTextBuilder.append("1").append(System.lineSeparator());

    for (int elementIndex = 2; elementIndex < root.getElementIndex(caretPosition) +2; 
        elementIndex++)
    {
        lineNumbersTextBuilder.append(elementIndex).append(System.lineSeparator());
    }
    return lineNumbersTextBuilder.toString();
}
}
public void goToLine(JTextPane text)
{
   String lineToSearch = JOptionPane.showInputDialog(null, "Line Number: ");
   int total = 0;
   int lineNum = 0;
   for (String line : text.getText().split("\n"))
   {
     lineNum +=1;
     String lineNumStr = lineNum + "";
     if (lineNumStr.compareTo(lineToSearch) == 0)
     {
        if( line == null)
        {
           text.setCaretPosition(total);
        }
        text.setCaretPosition(total);
        break;
     }
     total += line.length() + 1;

   }
 }
 public void search(JTextPane text) 
 { 
  Document myText = text.getDocument();
  final StyleContext cont = StyleContext.getDefaultStyleContext();
  final AttributeSet reset = cont.addAttribute(cont.getEmptySet(), 
     StyleConstants.Foreground,Color.GREEN);
  String wordToSearch = JOptionPane.showInputDialog(null, "Word to search for:");
  Highlighter highlighter = text.getHighlighter();
  highlighter.removeAllHighlights();
  HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.pink);

  int m;
  int total = 0;
  for (String line : text.getText().split("\n")) 
  {
     m = line.indexOf(wordToSearch);
     if(m == -1)
     {
        if(isUnix())
        {
        total += line.length() + 1;
        }
        else if(isWindows())
        {
           total += line.length();
        }
        else if(isMac())
        {
           total += line.length() + 1;
        }
        else
        {
           total += line.length() + 1;
        }
        continue;
     }
     try
     {
        highlighter.addHighlight(total + m, total + m + wordToSearch.length(), painter);
     }catch(BadLocationException ex)
     {}
     while(true)
     {
        m = line.indexOf(wordToSearch, m + 1);

        if (m == -1)
        {

           break;
        }
        try{
        highlighter.addHighlight(total + m, total + m + wordToSearch.length(), painter);
        }catch(BadLocationException e)
        {
        }
     }
     if(isUnix())
        {
        total += line.length() + 1;
        }
        else if(isWindows())
        {
           total += line.length();
        }
        else if(isMac())
        {
           total += line.length() + 1;
        }
        else
        {
           total += line.length() + 1;
        }
        continue;
  }
  try
        {
         myText.insertString(total,"", reset);
        }
        catch(BadLocationException ex)
        {

        }
  }

1 个答案:

答案 0 :(得分:2)

代码似乎有点复杂,所以我不确定这一切是什么。

但是,这些链接可能有助于简化代码:

  1. Text and New Lines - 我猜想因为Window有一个两个字符的行分隔符,你的代码有异常逻辑。解决方案是使用textPane.getDocument().getText(...)

  2. Text Utilities可能更容易理解和使用。然后不要使用魔术数字。

  3. 查看Utilities课程。像getRowStart(...)和getRowEnd(....)这样的方法将更容易提取文本,因为一旦你知道开始/结束偏移,你可以使用getText(...)方法和那些参数。 / p>

  4. 如果您尝试使用行号,则还可以查看Text Component Line Number