所以我的代码正在运行,可能不是最漂亮或最有效但现在它完成了工作。但是,我的问题是为什么我需要某些偏移值,比如我的某些函数的位置为+ 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)
{
}
}
答案 0 :(得分:2)
代码似乎有点复杂,所以我不确定这一切是什么。
但是,这些链接可能有助于简化代码:
Text and New Lines - 我猜想因为Window有一个两个字符的行分隔符,你的代码有异常逻辑。解决方案是使用textPane.getDocument().getText(...)
。
Text Utilities可能更容易理解和使用。然后不要使用魔术数字。
查看Utilities
课程。像getRowStart(...)和getRowEnd(....)这样的方法将更容易提取文本,因为一旦你知道开始/结束偏移,你可以使用getText(...)方法和那些参数。 / p>
如果您尝试使用行号,则还可以查看Text Component Line Number。