• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Swing のJScrollPane について教えてください)

SwingのJScrollPaneについて教えてください

このQ&Aのポイント
  • SwingのJScrollPaneを使用してアプレットを作成中です。パネルのサイズの調整やスクロールの制御を行いたいのですが、うまくいきません。
  • 具体的には、JPanelに時系列データを描画し、常に一番下までスクロールする処理を実装しています。しかし、スライダが正しく動作せず、前回のサイズの最大値に設定されてしまいます。
  • どのように修正すれば正しくスクロールできるようになるのか、分からない状況です。ご教授いただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.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の縦の増加分>) } のような感じにすると,もしかしたらうまくいくようになるかもしれません。

ikazinat
質問者

補足

aton さん丁寧な回答ありがとうございます。 早速試してみた所、  p.revalidate() を this.revalidate() に変えてみましたが結果は同じでした。  sb.setMaximum(sb.getMaximum() + <pの縦の増加分>)  を追加した所、スクロールバーの最大値は確かに更新されました。  しかし、この後で、   sb.setValue(sb.getMaximum());  とやってみましたが、どうしても、前回の最大値の部分にしかスライダが移動しませんでした。  試しに、   sb.setValue(10000);  とパネルより大きい固定値を指定してみましたが、結果は同じでした。 この動作から推測すると、sb.setMaximum() は溜まっているイベントを処理した後 にしか、正しく反映されないのではないか?。 という風に思っています。 JPanel の替わりに JTextArea で試してみたら、キチンと最大値にスライダは移動するので、 何等かの方法はあると思っています。 aton さんに頼ってばかりも申し訳ないので、もう少し、調べてみます。 もし、何がお気づきの点などございましたら、よろしくお願いいたします。

その他の回答 (1)

  • aton
  • ベストアンサー率47% (160/334)
回答No.1

 私も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()してみるとよいのではないでしょうか。  はっきり言って自信はありませんが…。

ikazinat
質問者

補足

aton さん、ご回答ありがとうございます。 スクロールバーの最大値は、JPanelに対しての  setPreferredSize();  revalidate(); で自動的に変わる物だと思っていました。 revalidate() の動作がイマイチ分からなかったので自信は 無かったんですけどね・・・。 早速、リスナーを登録しての方法を試してみます。 また何かありましたら、お願いいたします。

関連するQ&A