Максимальное значение 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);
}
});
}
}