JEditorPane 在换行符和 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);
}
});
}
}