nogの日記: JTextArea と JScrollBar 3
jIRCのFeature Requestで、全ログ窓の自動スクロール機能の付加というリクエストが上がっている。実は、現状でもそう機能するように作っているつもりなのだが、アクティブなチャンネルでさえきちっと最後までスクロールしていない感じだ。なんとなくsetLineWrapで折り返している部分を無視している雰囲気だ。
それなりに動いていたので、気にしないようにしていたが、だんだん他の直したい所や付け加えたい機能よりも難易度が低くなってきたのでやっつけることにしてみた。
修正前は、JTextArea の appendを実行したあとで、JScrollBar のインスタンスにたいして、 scrollBar.setValue(scrollBar.getMaximum())とスクロールさせた。
public void append(String message) {
ta.append(getTime() + " " + message + CRLF);
scrollBar.setValue(scrollBar.getMaximum());
}
いろいろ試した結果、いい感じに動いたのは、チェンジリスナをJScrollBarの getModel()にたいして追加し、そのリスナでスクロールさせる方法だ。
scrollBar = scrollPane.getVerticalScrollBar();
ChangeListener l = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
scrollBar.setValue(scrollBar.getMaximum());
}
};
scrollBar.getModel().addChangeListener(l);
これだときっちりスクロールする。完璧!
とおもったものの、問題が一つ。スクロールバーの内容が変わったら、最大値にセットすることを別スレッドで行っているため、バックスクロールできない。使用とした瞬間に最大値にセットするため。ダメじゃん、、、、
もう一工夫必要らしい。
しかし、ソースを日記に書くと読みにくいなぁ、、、
タグってblockquoteで良かったと思ったのに、、、
そーそー (スコア:1)
はっきり言って辛い;;
ちゅうことで、workarroundは「テキスト形式」と使うとか「全角スペース(って何よ)で字下げ」とからしい。
前者は一切タグが使えない、後者はコピーペーストでコードをそのままはっつけられない(日記からはりつける、日記にはりつけるの両方)という欠点があります。
他にもいい方法があったら教えてください
-- Takehiro TOMINAGA // may the source be with you!
Re:そーそー (スコア:1)
でも、半角スペース1つで、半角2文字分インデントしちゃうのよね…
Re:そーそー (スコア:1)
ちとためしに今使ってみています ^-^;;
{
{
{
test;
}
}
}