現在、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() を行います。
その際、スライダが、一番下までスクロールされず、前回のサイズの
最大値に設定されてしまいます。
根本的なやり方がマズイのか、何がが足りないのかも分からない状態です。
申し訳ございませんが、ご教授頂いたいと思います。
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の縦の増加分>)
}
のような感じにすると,もしかしたらうまくいくようになるかもしれません。
この回答への補足
aton さん丁寧な回答ありがとうございます。
早速試してみた所、
p.revalidate() を this.revalidate() に変えてみましたが結果は同じでした。
sb.setMaximum(sb.getMaximum() + <pの縦の増加分>)
を追加した所、スクロールバーの最大値は確かに更新されました。
しかし、この後で、
sb.setValue(sb.getMaximum());
とやってみましたが、どうしても、前回の最大値の部分にしかスライダが移動しませんでした。
試しに、
sb.setValue(10000);
とパネルより大きい固定値を指定してみましたが、結果は同じでした。
この動作から推測すると、sb.setMaximum() は溜まっているイベントを処理した後
にしか、正しく反映されないのではないか?。
という風に思っています。
JPanel の替わりに JTextArea で試してみたら、キチンと最大値にスライダは移動するので、
何等かの方法はあると思っています。
aton さんに頼ってばかりも申し訳ないので、もう少し、調べてみます。
もし、何がお気づきの点などございましたら、よろしくお願いいたします。
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()してみるとよいのではないでしょうか。
はっきり言って自信はありませんが…。
この回答への補足
aton さん、ご回答ありがとうございます。
スクロールバーの最大値は、JPanelに対しての
setPreferredSize();
revalidate();
で自動的に変わる物だと思っていました。
revalidate() の動作がイマイチ分からなかったので自信は
無かったんですけどね・・・。
早速、リスナーを登録しての方法を試してみます。
また何かありましたら、お願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaで文字の角度を変えて表示...
-
C#のGraphicsクラスについてです。
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
C#でフォームのオブジェクト名...
-
JTextFieldの入力制限
-
VBA 同じ名前のオブジェクトを...
-
変数名の付け方
-
C# でメソッドに送られてきたOb...
-
河合塾のクラス分けについて
-
c++でのヘッダーファイルの循環...
-
C# インスタンスの破棄
-
tryの終了
-
Javaの問題なんですが、(this==...
-
Javaでブラウザ判定
-
同じクラスにならない確率を教...
-
DataGridViewでセルクリックイ...
-
mainメソッドのthrows節で設定...
-
java-別クラスの変数の使い方を...
-
C#で右からnカラム目に文字を挿...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# リストビューの特定のセルの...
-
VB.NETのSendMessageを教えてく...
-
C# DataGridView のCellPaintin...
-
PDF帳票を作成するためのフリー...
-
JAVAでの背景画像表示
-
VB.NET フォーム上に描いたグ...
-
SwingとEDT(イベントディスパッ...
-
アクセスで他アプリから復帰し...
-
Labelコントロールの背景をグラ...
-
Androidのフォントサイズ(SP)と...
-
画面のちらつきの原因が知りた...
-
Canvas等の図形を移動する時,直...
-
複数画像表示切り替え Visual c++
-
javaでクイズ
-
Androidで画像の中で指定した範...
-
C#のGraphicsクラスについてです。
-
C# テキストボックスについて
-
描画してもウィンドウをリサイ...
-
VS Treeview のデザイン変更
-
GDI+で描画した画像を消去する...
おすすめ情報