web-dev-qa-db-ja.com

内部部品によるJPanelサイズ

JPanelに、含まれているすべてのコンポーネントに合うようにサイズを設定するように指示することはできますか? JFrameのpack()のようなもの。

編集:preferredSizeのトリックは役に立ちませんでした。 JSplitPaneがあります。ここには、多くのラベルが付いたGridBagLayoutがあり(スクリーンショットを参照)、ラベルが互いに重なり合っています。

スクリーンショットhttp://foto.darth.cz/pictures/screen.png

21
Jakub Arnold

pack()のソースコードを見た後、私は次のことを思いつきました。

_    panel.setPreferredSize(panel.getPreferredSize());
_

これにより、パネルは、サブコンポーネントの優先サイズに基づいて、優先サイズを再計算します。

後で validate() を呼び出す必要がある場合とない場合があります。私の小さな例では、違いはないように見えましたが、Javadocは次のように述べています。

validateメソッドは、コンテナにそのサブコンポーネントを再度レイアウトさせるために使用されます。コンテナが表示された後、このコンテナのサブコンポーネントが変更された(コンテナに追加または削除された、またはレイアウト関連の情報が変更された)ときに呼び出す必要があります。

したがって、JPanelを再梱包する必要がある理由によって異なります。

20
Michael Myers

デフォルトでは、Containersには、コンテナによって指定された優先レイアウトサイズと一致する優先サイズがあります。つまり、文字通りあなたがしなければならないのは:

panel.setSize(panel.getPreferredSize());

おそらく、あなたは親と何か奇妙なことをして、親のレイアウトマネージャーがこれと同等のことをするのを止めているのでしょう。

Netbeans GUI Builderを使用して同様の問題が発生しました。私の内側のパネルは奇妙なサイズになっていた。最小サイズと優先サイズを手動で調整しようとしていましたが、これは苛立たしい作業でした。

この問題は、I すべての最小サイズと優先サイズをデフォルトにリセット(Netbeans GUIビルダーの場合:JPanelコンポーネントを右クリック->プロパティ-> PreferredSize->デフォルトにリセット)で解決されました。 強制されたサイズがない場合、jpanelは内部コンポーネントのサイズを取ります。

注:私の場合はGridBaLayoutを使用しました

1
S.Chichin

パネルから削除することで、そのようなことができるかもしれません

setResizable(false);

1
Iralda Mitro

私は試してみます:

panel.revalidate();
panel.repaint();

これは必ずしもパネルをその好ましいサイズに設定するわけではありません。それはレイアウトマネージャーが何を使用することを決定するかに依存します。

これは、現在表示および表示されているパネルからコンポーネントを追加/削除した場合に役立ちます。

更新:スクリーンショットに基づいて、次のように言うことができます。1)プログラムで仕切りの位置を変更することを検討してください。 2)分割ペインの両側を表示するのは少しきついように見えるので、プログラムでウィンドウ自体のサイズを水平方向に変更することを検討してください。または両方。あなたはすることによって仕切りの位置を設定することができます

splitPane.setDividerLocation(newSize);

これには2つのオーバーロードされたメソッドがあることに注意してください。1つはfloatを取り、もう1つはintを取ります。 floatはサイズのパーセンテージを実行し、intはピクセル単位のサイズです。サイズは左側のパネル(またはその方向の上部パネル)用です。パネルの好みの幅に基づいて、仕切りの位置を変更することを検討します。

1
Avrom

JSplitPanesは、子のサイズに関しては少し面倒です。 Javaチュートリアル 。GridBagLayoutを正しく使用していますか?設定されていないようです。右JPanelの最小サイズを適切に。

0
schweerelos

Javax.swingの謎は徐々に明らかになり、Swingの神々に多くの献酒(特に髪の毛の塊を引き裂いたり、真夜中の油を燃やしたりする時間など)を提供する準備ができている人にのみ明らかになります。

ただし、この場合、フレームワークがとにかく実行する必要があると通常考えていることを実行する一種のスイスアーミーナイフとして、次のことをお勧めします。

myJPanel.getTopLevelAncestor().validate()

聖典が言うように、「このコンテナとそのすべてのサブコンポーネントを検証します」。 (Container.validate)。 NB getTopLevelAncestor()はJComponentメソッドです。

JSplitPaneがこれにどのように適合するかを思い出せません。試してみると、両方のコンポーネント(右と左、上と下)が検証されることがわかりますが、仕切りを変更しても、とにかくこれが行われない場合は驚きます。 。

0
mike rodent