アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、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() を行います。


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

申し訳ございませんが、ご教授頂いたいと思います。

A 回答 (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の縦の増加分>)
}

のような感じにすると,もしかしたらうまくいくようになるかもしれません。

この回答への補足

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
    • good
    • 0

 私も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() の動作がイマイチ分からなかったので自信は
無かったんですけどね・・・。

早速、リスナーを登録しての方法を試してみます。
また何かありましたら、お願いいたします。

補足日時:2001/08/23 13:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!