Java JTextPane中的最大CaretPosition不等于带CRLF换行符的Textlength

Java JTextPane中的最大CaretPosition不等于带CRLF换行符的Textlength,java,swing,newline,jeditorpane,Java,Swing,Newline,Jeditorpane,JEditorPane在换行符后的CaretPosition和文本长度方面有一种奇怪的行为。如果有回车符和换行符,则该换行符后的插入符号位置为1到低,因为Java在计算插入符号位置时将其视为一个字符。但是,Textlength将其正确处理为两个字符。此行为似乎是由于,但我认为不可能使.getCaretPosition与.getText.length同步,而与所使用的换行符无关 我附上了一个小代码。只需将插入符号放在第二行的末尾,然后按update。TextLength为5,但CaretPosit

JEditorPane在换行符后的CaretPosition和文本长度方面有一种奇怪的行为。如果有回车符和换行符,则该换行符后的插入符号位置为1到低,因为Java在计算插入符号位置时将其视为一个字符。但是,Textlength将其正确处理为两个字符。此行为似乎是由于,但我认为不可能使.getCaretPosition与.getText.length同步,而与所使用的换行符无关

我附上了一个小代码。只需将插入符号放在第二行的末尾,然后按update。TextLength为5,但CaretPosition结尾处仅为4。如果我只使用CR作为换行符,这是可以的。一个JTextArea正在做正确的事情。这个问题的根源与之相似

你有什么办法解决这个问题吗

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.event.*;

    public class test2 extends JFrame {

    JTextComponent testingArea = new JEditorPane();
    JButton button = new JButton("Update");
    JTextComponent resultArea = new JTextField(25);


    public test2() {
    initialise();
    testingArea.setText("01\r\n4");
}


private void initialise() {
    testingArea.setPreferredSize(new Dimension(100,100));
    setLayout(new FlowLayout());
    getContentPane().add(testingArea);
    getContentPane().add(new JLabel("answer"));
    getContentPane().add(resultArea);
    getContentPane().add(button);
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            try { 
                int caretPosition = testingArea.getCaretPosition();
                int textLength = testingArea.getText().length();
                resultArea.setText("TextLength is " + textLength + ". Current CaretPosition is " + caretPosition);
            }catch (Exception ex) {
                ex.printStackTrace();
                resultArea.setText("ERROR");
            }

        }
    });
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
    final test2 ex = new test2();
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            ex.pack();
            ex.setVisible(true);

        }
    });
}
}

这有关系吗?它是否影响您正在做的任何事情??我需要正确的getCaretPosition来动态定义文本的子字符串,并根据模型中的文本显示正确的当前插入符号位置。解决方案显示在您链接到的线程中。您需要从文档而不是组件中获取文本。也许阅读能帮助你理解正在发生的事情。此外,您可能不应该使用绝地武士窗格。它被设计用来显示HTML。使用JTextArea或JTextPane。