現在、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で質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAppletのpublic void paint(Graphics g)

は抽象クラスのGraphicsのオブジェクトを引数に持ちますが抽象クラスはオブジェクトを発生できないのに何故オブジェクトを渡せるのでしょうか?

Aベストアンサー

実際にパラメータとして渡されるのは、Graphicsのサブクラスのインスタンスだからです。

Graphics クラスは抽象クラスですが、そのサブクラスは抽象クラスとは限りません。

Qpublic static void main(String args

public static void main(String args[]) {

public static void main(String[] args) {
は何が違います?

Aベストアンサー

何も違いません。

javaでは配列を宣言する時に、型の後ろに[]をつけても
変数名の後ろに[]を付けてもどちらでもいいことになっています。

Qプログラムの中でpublic void showAAA()をメインメソッドから実行するには???

タイトルの通りなのですがプログラムの中で、public void showAAA()というメソッドをメインメソッドから実行するにはどのように記述すればいいのでしょうか???

Aベストアンサー

こんばんは~!(^o^)丿

やり方として2つありますね!
(1)mainからclassを分け、インスタンスを生成してメソッドを呼ぶならこんな感じです。

class Main
{
public static void main(String[] args)
{
A a = new A();
a.showAAA();
}
}
class A
{
public void showAAA() {
System.out.println("showAAA()");
}
}

(2)classを分けず、インスタンスを生成しない場合はstaticにします。こんな感じです。

class Main
{
public static void main(String[] args)
{
showAAA();
}

public static void showAAA() {
System.out.println("showAAA()");
}
}

わからないことがあったらまたどうぞ!
では~(^^♪

こんばんは~!(^o^)丿

やり方として2つありますね!
(1)mainからclassを分け、インスタンスを生成してメソッドを呼ぶならこんな感じです。

class Main
{
public static void main(String[] args)
{
A a = new A();
a.showAAA();
}
}
class A
{
public void showAAA() {
System.out.println("showAAA()");
}
}

(2)classを分けず、インスタンスを生成しない場合はstaticにします。こんな感じです。

class Main
{
public static void main(String[] args)
{
showAAA();
}

public...続きを読む

Qアプレットのinitは、なせ"public void init()とかくのでしょうか

java初心者です、宜しくお願いします。
javaのコンストラクターについて質問致します、宜しくお願いします。

アプリケーションのコンストラクターは、"public *****(){}"
となりますが、

アプレットのinitは、"public void init(){}"となるのはどのような理由から
でしょうか。

参考書等を色々検索しましたが、ヒットしませんでした、宜しくお願いします。

Aベストアンサー

通常のクラスでは、初期化処理は new をした時のコンストラクタで行いますが、
画面に表示する部品のようなクラスでは、初期化処理のタイミングが異なります。

init の説明
https://docs.oracle.com/javase/jp/8/docs/api/java/applet/Applet.html#init--

説明を読むと、アプレットはブラウザとかビューアによって new されます。
恐らくその後でセキュリティー的な諸設定を行ない、
端末がスリープ状態とか画面が非表示とかでないタイミングを待ってから、
ようやくユーザーによる初期化処理を認めているのでしょう。

というわけで、コンストラクタで初期化させたくない、なにか特別な事情があるクラスの場合は、
コンストラクタとは別に init とか initialize とか configurate などのメソッドを用意することがあります。

QInteger.parseInt()について public static void main(String[] args) { int a =

初歩的な質問だと思うのですが、、、

public class TestTree {

public static void main(String[] args) {

int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);

GreatTree myTree = new GreatTree(a, b);
myTree.makeTree();
myTree.makeGround();
}

}

というプログラムについて、Integer.parseInt()はどういう意味を持つのかがわかりません。ただ適当につけた名前だとは思えないです。教えてもらえたら幸いです。お願いします。

Aベストアンサー

> argsで入力されたものは例え数字でも文字列として扱われているから、それをintにしている。ということですよね?

引数として (String[] args) と設定されていますので、
おっしゃるとおり 引数 args[]配列に入っているものは、文字列です。

ポイントは、 「String[]」でしょうか。。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報