OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • すぐに回答を!
  • 質問No.122648
  • 閲覧数783
  • ありがとう数0
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 33% (4/12)

現在、Swing を使用して以下の様な処理のアプレットを作成しています。

---------------------------------------------------------------
 // 画面構成
 JPanel p = new JPanel();
 JScrollPane sp = new JScrollPane(
  p,
  ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
  ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED
 );
---------------------------------------------------------------
 // パネルサイズの調整
 public void resizePanel()
 {
  p.setPreferredSize(new Dimension(400, 少しづつ増やす));
  p.revalidate();
 }
---------------------------------------------------------------
 // 一番下までスクロールさせる
 public void scrollToMaximun()
 {
  JScrollBar sb = sp.getVerticalScrollBar();
  sb.setValue(sb.getMaximum());
 }
---------------------------------------------------------------

処理内容は、発生したデータを JPanel に時系列に描画していき、
常に一番下までスクロールさせるという物です。

具体的には、データが発生する度に、描画 & resizePanel() &
scrollToMaximun() を行います。


その際、スライダが、一番下までスクロールされず、前回のサイズの
最大値に設定されてしまいます。
根本的なやり方がマズイのか、何がが足りないのかも分からない状態です。

申し訳ございませんが、ご教授頂いたいと思います。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル11

ベストアンサー率 47% (160/334)

 再び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

お礼率 33% (4/12)

aton さん丁寧な回答ありがとうございます。

早速試してみた所、
 p.revalidate() を this.revalidate() に変えてみましたが結果は同じでした。

 sb.setMaximum(sb.getMaximum() + <pの縦の増加分>)
 を追加した所、スクロールバーの最大値は確かに更新されました。

 しかし、この後で、
  sb.setValue(sb.getMaximum());
 とやってみましたが、どうしても、前回の最大値の部分にしかスライダが移動しませんでした。
 試しに、
  sb.setValue(10000);
 とパネルより大きい固定値を指定してみましたが、結果は同じでした。

この動作から推測すると、sb.setMaximum() は溜まっているイベントを処理した後
にしか、正しく反映されないのではないか?。
という風に思っています。

JPanel の替わりに JTextArea で試してみたら、キチンと最大値にスライダは移動するので、
何等かの方法はあると思っています。

aton さんに頼ってばかりも申し訳ないので、もう少し、調べてみます。
もし、何がお気づきの点などございましたら、よろしくお願いいたします。
投稿日時 - 2001-08-23 16:56:33
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル11

ベストアンサー率 47% (160/334)

 私もSwing詳しくないんですが,誰も答えないようなので。  APIドキュメントを読むかぎりでは,JScrollBarはBoundedRangeModelを利用してサイズや位置の設定をしています。BoundedRangeModelには「値(value)」「長さ(extent)」「最小値(minimum)」「最大値(maximum)」の4つの基本プロパティがありますが,ikazinatさんの例ではJSc ...続きを読む
 私も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

お礼率 33% (4/12)

aton さん、ご回答ありがとうございます。

スクロールバーの最大値は、JPanelに対しての
 setPreferredSize();
 revalidate();
で自動的に変わる物だと思っていました。
revalidate() の動作がイマイチ分からなかったので自信は
無かったんですけどね・・・。

早速、リスナーを登録しての方法を試してみます。
また何かありましたら、お願いいたします。
投稿日時 - 2001-08-23 13:25:12


このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ