現在、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で質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Java Java 配列<選挙> 4 2023/07/31 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVAでの背景画像表示
-
<JFreeChart> 縦軸の値の間隔を...
-
GDI+で描画した画像を消去する...
-
Java、jPanelに描画する
-
JavaScriptで直線を描画したい
-
SwingのpaintComponent(...
-
VB.NET フォーム上に描いたグ...
-
BMP画像を画像処理して連続に表...
-
Java 15パズルを作ったのですが...
-
VB.NETのSendMessageを教えてく...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
c++,ある関数のクラスから別の...
-
private static という変数の修飾
-
3年間同じクラスになる確率
-
配列の重複する値とその個数を...
-
コマンドプロンプト実行後に画...
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NET フォーム上に描いたグ...
-
VB.NETのSendMessageを教えてく...
-
JAVAでの背景画像表示
-
C# DataGridView のCellPaintin...
-
重なった要素上でのイベントで...
-
C# リストビューの特定のセルの...
-
Androidで画像の中で指定した範...
-
画面のちらつきの原因が知りた...
-
複数画像表示切り替え Visual c++
-
Labelコントロールの背景をグラ...
-
VS Treeview のデザイン変更
-
描画処理が実行されない
-
GDI+で描画した画像を消去する...
-
このプログラミングをどう組み...
-
canvasで表示されてる画像を1...
-
ドラッグして矩形を描くには
-
getGraphics()の意味を教えて...
-
Canvas等の図形を移動する時,直...
-
DirectXのスプライト機能で3D回転
-
Exception occurred during eve...
おすすめ情報