字符位置歧义java

时间:2014-04-11 18:25:43

标签: java swing

我使用JEditorPane styledDocument

我的问题是由换行引起的。因为我正在申请Windows,换行符由(CR LF)表示。

问题是文本提取表单编辑器工具包上的chartAt(int)方法将换行符计为两个字符,但styledDocument上的setCharacterAttributes(int, int, AttributeSet, boolean)方法将换行符计为一个字符。

假设我想在所有字符“福”上应用属性集。简单直观:

String text; //set to text of JEditorPane
StyledDocument doc; //set to doc of JEditorPane 
int length = text.length();
for (int iii = 0; iii < length; iii++) {
    if (text.chartAt(iii) == '福')
        doc.setCharacterAttributes(iii, 1, AttributeSet, boolean);
}

它只能在第一个换行符之前使用。然后它会关闭一个char,并且每个换行符都会有一个char。

我如何处理一致的角色位置?

2 个答案:

答案 0 :(得分:1)

当使用StyledDocument读取文档时,它将保留在内存中,换行符由'\n'替换。资料来源:here

因此,您必须考虑到这一点,并使用EndOfLineStringProperty property检查换行符的长度。

因此,每当您在文本中看到'\n'时,您必须知道是否必须将其计为1或2个字符。

其他解决方案是:

  • 阅读完文档后,将EndOfLineStringProperty更改为'\n',然后指示StyledDocument将文档保存为字符串。然后在该String中,您可以将换行计为一个char,就像StyledDocument一样。
  • EndOfLineStringProperty内每次出现'\n'替换为text,然后计数就可以了。

答案 1 :(得分:0)

  

它只能在第一个换行符之前使用。然后它会关闭一个char,并且每个换行符都会有一个char。

这听起来与JTextPane发现的问题相同。查看Text and New Lines了解详情。

建议的解决方案是使用:

text.getDocument().getText();

而不是

text.getText();