- ベストアンサー
SwingのJScrollPaneについて教えてください
- SwingのJScrollPaneを使用してアプレットを作成中です。パネルのサイズの調整やスクロールの制御を行いたいのですが、うまくいきません。
- 具体的には、JPanelに時系列データを描画し、常に一番下までスクロールする処理を実装しています。しかし、スライダが正しく動作せず、前回のサイズの最大値に設定されてしまいます。
- どのように修正すれば正しくスクロールできるようになるのか、分からない状況です。ご教授いただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
再びatonです。 > スクロールバーの最大値は、JPanelに対しての > setPreferredSize(); > revalidate(); > で自動的に変わる物だと思っていました。 これを見て思いついたんですが,resizePanel()メソッドの p.revalidate() を this.revalidate() に変えるとListenerなど使う必要がないかもしれません。ただJScrollPaneはデフフォルトでisValidateRoot()にtrueを返すことになっているので,期待薄ですが。 或いは,resizePanel()メソッドを, public void resizePanel() { p.setPreferredSize(new Dimension(400, 少しづつ増やす)); p.revalidate(); JScrollBar sb = sp.getVerticalScrollBar(); sb.setMaximum(sb.getMaximum() + <pの縦の増加分>) } のような感じにすると,もしかしたらうまくいくようになるかもしれません。
その他の回答 (1)
- aton
- ベストアンサー率47% (160/334)
私もSwing詳しくないんですが,誰も答えないようなので。 APIドキュメントを読むかぎりでは,JScrollBarはBoundedRangeModelを利用してサイズや位置の設定をしています。BoundedRangeModelには「値(value)」「長さ(extent)」「最小値(minimum)」「最大値(maximum)」の4つの基本プロパティがありますが,ikazinatさんの例ではJScrollPaneのAPIドキュメントでいうところの「scrollable client」=JPanelのサイズが変わる(大きくなる)ので,それに合わせてJScrollBarのmaximumの値も変更してやる必要があるのではないかと思います。 JPanelにPropertyChangeListenerかなんかを貼り付けて,JPanelのサイズが変更されたらそのイベントがJScrollPaneあるいはJScrollBarに通知されるようにし,それをもとにJScrollBar#setMaximum()してやったあと,JScrollBar#setValue()してみるとよいのではないでしょうか。 はっきり言って自信はありませんが…。
補足
aton さん、ご回答ありがとうございます。 スクロールバーの最大値は、JPanelに対しての setPreferredSize(); revalidate(); で自動的に変わる物だと思っていました。 revalidate() の動作がイマイチ分からなかったので自信は 無かったんですけどね・・・。 早速、リスナーを登録しての方法を試してみます。 また何かありましたら、お願いいたします。
補足
aton さん丁寧な回答ありがとうございます。 早速試してみた所、 p.revalidate() を this.revalidate() に変えてみましたが結果は同じでした。 sb.setMaximum(sb.getMaximum() + <pの縦の増加分>) を追加した所、スクロールバーの最大値は確かに更新されました。 しかし、この後で、 sb.setValue(sb.getMaximum()); とやってみましたが、どうしても、前回の最大値の部分にしかスライダが移動しませんでした。 試しに、 sb.setValue(10000); とパネルより大きい固定値を指定してみましたが、結果は同じでした。 この動作から推測すると、sb.setMaximum() は溜まっているイベントを処理した後 にしか、正しく反映されないのではないか?。 という風に思っています。 JPanel の替わりに JTextArea で試してみたら、キチンと最大値にスライダは移動するので、 何等かの方法はあると思っています。 aton さんに頼ってばかりも申し訳ないので、もう少し、調べてみます。 もし、何がお気づきの点などございましたら、よろしくお願いいたします。