1

JEdi​​torPane は、改行後の 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);

        }
    });
}
}
4

0 に答える 0