在JTextPane中逐行读取文本

时间:2011-04-02 09:38:20

标签: java swing jtextpane

我正在编写一个带语法高亮的编辑器。我想要做的是获取当前行并解析它而不是整个文档。问题是我可能做错了但我不知道为什么。 这就是我正在做的事情:

public void keyReleased(KeyEvent e) {
    System.out.println(e);
    try {
    int inizio = Utilities.getRowStart(ta, ta.getCaretPosition());
    int fine = Utilities.getRowEnd(ta, ta.getCaretPosition());
    System.out.println("Inizio: " + inizio + " - Fine: " + fine);
    Element root = ta.getDocument().getDefaultRootElement();
    if(inizio == fine) System.out.println("Mi trovo ad inizio riga");
    else {
        int linea = RXTextUtilities.getLineAtCaret(ta);
        System.out.println("Linea: " + linea);
        Element child = root.getElement(linea-1);
        System.out.println("Testo corrente: " + child.getDocument().getLength() );
    }
    } catch (BadLocationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

我对使用javax.swing.text.Element的理解是,我可以得到我想要的那一行(孩子)而不是工作,但是child.getDocument.getLength()给了我整个文档的长度。我做错了什么?

编辑#1:

child.getDocument.getLength()给出了文档开头的长度,我期望当前的行长度。请参阅:我使用int linea = RXTextUtilities.getLineAtCaret(ta);得到了我的行号,而不是使用root.getElement(linea-1)提取行,所以我希望child.getDocument().getLength()能够给出当前行的长度。

RXTextUtilities链接:http://www.camick.com/java/source/RXTextUtilities.java

1 个答案:

答案 0 :(得分:2)

对于您的特定情况,您将获得整个文档的长度,因为child.getDocument()实际上返回了嵌入子文档的文档。

您可以使用child.getStartOffset()child.getEndOffset()来确定文档中的开始和结束,然后从整个文档中剪切出来。

int start = child.getStartOffset();
int end = child.getEndOffset();
int length = end - start;
String text = child.getDocument().getText(start, length);

请注意,该文本还包含EOL分隔符。