Максимальное значение CaretPosition в JTextPane, не равное длине текста с разрывом строки CRLF

JEditorPane имеет странное поведение в отношении CaretPosition после переноса строки и TextLength. Если есть CarriageReturn и LineFeed, позиция каретки после этого разрыва - от одного до низкого, потому что Java рассматривает ее как один символ при вычислении CaretPosition. Длина текста, однако, обрабатывает его как два символа. Такое поведение, кажется, является результатом 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);

        }
    });
}
}

0 ответов

Другие вопросы по тегам