JEditorPane は、改行後の CaretPosition と TextLength に関して奇妙な動作をします。CarriageReturn と LineFeed がある場合、Java が CaretPosition を計算する際に 1 文字と見なすため、その改行後の Caret Position は 1 から低くなります。ただし、Textlength は 2 文字として正しく処理します。この動作はDefaultEditorKitに起因するようですが、使用されている改行とは無関係に .getText().length() と同期する .getCaretPosition を取得する可能性はありません。
小さなコードを添付しました。キャレットを 2 行目の最後に置き、更新を押します。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);
}
});
}
}