1

JEdi​​torPane 在换行符和 TextLength 之后具有关于 CaretPosition 的奇怪行为。如果存在 CarriageReturn 和 LineFeed,则中断后的 Caret Position 为一到低,因为 Java 在计算 CaretPosition 时将其视为一个字符。但是,Textlength 将其正确处理为两个字符。这种行为似乎是由DefaultEditorKit引起的,但我看不到使 .getCaretPosition 与 .getText().length() 同步的可能性,而与使用的换行符无关。

我附上了一个小代码。只需将插入符号放在第二行的末尾并按更新。TextLength 是 5,但 CaretPosition 最后只有 4。如果我只使用 CR 作为换行符,那没关系。JTextArea 做得对。问题的根源 类似于 JTextPane 中的插入符号位置不正确?!错误或预期行为?.

你有什么想法来解决这个问题吗?

    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);

        }
    });
}
}
4

0 回答 0