Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么需要偏移值_Java_Swing_Jtextpane - Fatal编程技术网

Java 为什么需要偏移值

Java 为什么需要偏移值,java,swing,jtextpane,Java,Swing,Jtextpane,因此,我的代码正在工作,可能不是最漂亮或最有效的,但现在它完成了工作。然而,我的问题是,为什么我需要某些偏移值,比如我的一些函数的位置有+1,而行号有+2。这些神奇的数字有点让人困惑,因为它们使程序按需工作,但为什么它们要这样做呢?我把这些+1加到总数中,我理解了它们为什么起作用,但仍然没有对这些神奇数字的具体解释。如果你能告诉我它们的意义那就太好了。下面是一些代码供参考 private String getLineNumbersText() { int counter = 0;

因此,我的代码正在工作,可能不是最漂亮或最有效的,但现在它完成了工作。然而,我的问题是,为什么我需要某些偏移值,比如我的一些函数的位置有+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)
        {

        }
  }
私有字符串GetLineNumberText()
{
int计数器=0;
int-caretPosition=textArea.getDocument().getLength();
元素根=textArea.getDocument().getDefaultRootElement();
StringBuilder lineNumbersTextBuilder=新StringBuilder();
lineNumbersTextBuilder.append(“1”).append(System.lineSeparator());
for(int-elementIndex=2;elementIndex
代码似乎有点复杂,所以我不确定它到底是做什么的

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

  • -我猜,因为窗口有两个字符的行分隔符,所以您的代码有异常逻辑。解决方案是使用
    textPane.getDocument().getText(…)

  • 可能更容易理解和使用。那就不要用神奇的数字

  • 查看
    实用程序
    类。像getRowStart(…)和getRowEnd(…)这样的方法将使提取文本更容易,因为一旦知道开始/结束偏移量,就可以使用getText(…)方法和这些参数

  • 如果您试图使用行号,那么您也可以签出


  • 当然,行号基本上显示在文本窗格的左侧。搜索突出显示要搜索的单词,go-to行转到指定行。如果(line==null)语句应该做什么?它似乎设置了一个插入符号的位置,它将被设置为同一个东西是的,我认为这可能有点多余,当我试图使一些工作