2009-09-06 10 views
1

Java GUI開発で(!)苦労しています。明らかな感覚をもたらすこれらの小さなものはすべて機能しません。私は何をしようとしているのか、どこに失敗しているのかを説明します(これはかなりイライラしています)。JavaのsetPreferredSizeのサイズが変更されないJPanel

私はパネル内にあるこのgraphics2dオブジェクトを持っています。今、このグラフィックスはイメージを描画し、それは永遠に続くことができます。この図は恐ろしく拡大し、予想されるサイズがわからないので、スクロールペインの中に入れます。今度は、各痛み反復でJPanelのサイズを変更し、setPreferredSizeをより大きな値に設定して、スクロールペインのノブを拡大します。

問題: 何らかの理由から、私がsetPreferredSizeをpaintから呼び出すときに何もしません。私はパネルでそれを呼び出します。 paintを呼び出す関数からsetPreferredSizeを呼び出すと、サイズ変更操作は1回だけ実行されます。

その理由は何ですか? グラフィックス描画が時間がかかり、サイズが大きくなるので、どのようにスクロールペインの位置を前進させることができますか? これは、徐々にそれを増やす?

人、ありがとうございました。私は確かにここで助けが必要です

答えて

6

兼ね備えサイズは

+0

wow、本当にトリックを再確認しました:Oありがとうございました。乾草の針を探しているのが好きです。あなたはスクロールバーを進める方法を知っていますか? – vondip

+0

なぜこのトピックについて複数の質問をしていますか?あなたはあなたの他の投稿にanserを与えられましたが、あなたは受け入れられたように質問をマークすることは決してありません。もちろん、paintComponent()メソッドからsetPreferredSizeを呼び出すべきではありません。そして、そのメソッドからrevalidateを呼び出すべきではありません。皆さんの質問を一緒にしたら、皆は何が示唆されたのかを知り、同じ提案をする時間を無駄にしません。将来的にあなたの質問にSSCCEを投稿してください。 SSCCEが何であるかわからない場合は、ウェブを検索してください。 – camickr

+0

@unknown:別のスレッドで要素をスクロールしてみてください。検証プロセスが完了していない間にどこかに設定し、そのプロセスがスクロールバーを0に戻しているかもしれません。 –

2

あなたはいくつかのものが間違っているように私に聞こえます。

  • あなたが本当に呼び出さペイントするとき、どのように頻繁にわからないので、おそらく奇妙な行動になりますpaintメソッド内の任意のサイズの属性(のすべてのコンポーネントのactuallly任意の属性)を設定

  • あなたは通常、自分の絵を呼び出すことはありません。コンポーネントが見えるようになると、Swing自身が呼び出すようになります。

  • 私は正しくコンポーネントを取得したいと思っています。 IMHO正しい方法は、タイマーを作成することです。タイマーを使用して、必要に応じてサイズを変更します。ペイント方法では、この情報を読んで、ペイントするものを決定するために使用します。

+0

私は既に、しばらくの間、repaintメソッドを呼び出すタイマーを持っています。私はコンポーネントのサイズを自分で設定しようとしましたが、この奇妙なことに気付きました。スクロールバーを遠端に移動すると(あたかもスクロールするように)JPanelが突然サイズ変更されます。なぜどんなアイデア?そして、スクロールペインを自分自身で進めるにはどうすればいいですか? – vondip

+0

あなたは上流のコンポーネント(JScrollpane)に変更について通知する必要があるように思えます。もし私が正しいとすれば、invalidate()は正しいことですが、私は完全にはわかりません。 –

1

setPreferredSizeは、あなたがのLayoutManagerに与えることができる多くのヒントの一つである...、その名前で、必須ではありません...多分(パック)または役立つだろう)(再検証されています実際にLayoutManagerが設定されている場合、コンポーネントのコンテナのレイアウトを管理しています。指定されたLayoutManagerは、これらのヒントを使用して何を実行するかは決まりです。

Filthy Rich Clientsの本を読んで、Swingコンポーネントのレンダリングの仕組みを詳しく解説することをお勧めします。

1

set(Preferred/Minimal/Maximum)Size()は、親コンポーネントとそのlayoutmanagerのヒントで、コンポーネントがどのくらいのスペースを取るべきかということに注意してください。 さらに、これらのサイズは、コンポーネントがレイアウトされたとき(最初のレンダー時、invalidate()時など)にのみ解釈されることに注意してください。