Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JTextPane スクロールされずに行数表示を更新したい。

Java - エディタを作る
http://abebas.sub.jp/java/JavaPrograming/01_Editor/005.html

を参考にエディターのJTextPaneの隣に行数表示のJTextPaneを置いて、setLinePane改めsetLineNoメソッドを呼び出して行数を表示させています。
とりあえずEnterなどが押されるなどして行数が変化したときにsetLineNoで行数を表示しなおす方法を考えていて、以下のようにEnterやBack Spaceが押されたときに呼び出されるようにしてみました。

@Override
public void keyReleased(KeyEvent event){
    if(event.getKeyCode()==KeyEvent.VK_ENTER){
        setLineNo();
    }
    else if(event.getKeyCode()==KeyEvent.VK_BACK_SPACE){ //Back Spaceの場合はPressedのときと行数が変わった時だけ
        Document doc = sorce.getDocument();
        no2 = doc.getDefaultRootElement().getElementIndex(doc.getLength())+1;
        if(no!=no2){
            setLineNo();
        }
    }
}

すると、たとえばEnterを押したとききちんと改行はされていますが、行表示の更新のためにスクロールが一番下へ行ってしまいます。
前とっかえじゃなくて以下のように最後に追記という手法にしてみても変わりませんでした。

Document doc = sorce.getDocument();
int maxLine = doc.getDefaultRootElement().getElementIndex(doc.getLength())+1;
pane.setDividerLocation((""+maxLine).length()*10);
doc = line.getDocument();;
SimpleAttributeSet attr = new SimpleAttributeSet();
attr.addAttribute(StyleConstants.Foreground,new Color(100,100,255));

try{
    doc.insertString(doc.getLength(), maxLine+"\n", attr);
} catch (BadLocationException e) {
    e.printStackTrace();
}

どのようにすればスクロールされずに行数表示を更新させることができるでしょうか?

2

回答

94196

閲覧

2件の回答

評価

10

テキストを編集する系統のコンポーネントはデフォルトで
キャレット位置がビューポート内に見えるように自動的に
スクロールするようになっていたと思います。

またテキストを編集するコンポーネントに備わっている変
更機能はたいてい「ユーザが入力した際のテキストの変化
を実現」する際便利なようにテキスト変更後に通常の入力
操作でユーザが期待するような位置へキャレットを移動す
るようになっていると思います。

以上によりご質問のような現象になったのだと思います。

プログラムからテキストを更新する場合は「更新後のキャ
レット位置はどうすべきか」を考慮して必要に応じてキャ
レット位置を再設定する必要があります。

また、複雑な編集を行う場合などキャレット位置へ一々ス
クロールされるのがうるさい場合には自動追従しないよう
にすることもできたかと思います。

詳細はAPI documentの"JTextComponent"->"キャレット変
更"を参照してみてください。

評価

0

教えてくれたAPIの情報が役に立ちました。
以下のコードでうまくいきました。

//JTextPane line;
DefaultCaret calet=new DefaultCaret();
calet.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
line.setCaret(calet);

KSwordOfHasteさんありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。