5

グラフに動的情報を追加するために JPanel (内部に複数のラベルを含む) を使用しています。このパネルは動的に作成され、描画に使用するまでは表示されません。

このために、私は BufferedImage を使用しており、この他の質問で説明されている手順とほぼ同じ手順に従います。すべてのサイズ (パネルとそのコンポーネント) を指定する限り、うまく機能します。

参照された質問のコメントでも同様に尋ねられたように、このパネルの最適なサイズを決定するにはどうすればよいですか? このパネルを通常のフレーム/レイアウト設定で表示した場合も同様の動作をします。

私の場合、このパネルをある意味で「パック」して、そのサイズとそのコンテンツのサイズが最適に設定されるようにするにはどうすればよいですか (ラベルのサイズによって決まります)。

4

2 に答える 2

3

Surajとwillcodejavaforfoodは、私を良い方向に導いてくれました。

メソッドで実際に何が行われているのかを確認するとpack()、これは主に現在のサイズを。によって返されるサイズに設定していることがわかりますgetPreferredSize()

これから、私はそのような解決策を作ることができました:

// Creating the panel
JPanel lPanel = new JPanel();
//lPanel.setSize(1000, 1000); //default size, not needed anymore
lPanel.setLayout(new BoxLayout(lPanel, BoxLayout.PAGE_AXIS));

//Adding the content
lPanel.add(new JLabel("Blah"));
// etc...

//Adjust the panel to its preferred size
lPanel.setSize(lPanel.getPreferredSize());

//Call the layout method 
//(this will adjust the content components to their correct size and position)
lPanel.doLayout();

この方法は正しく機能し、パネルとそのコンテンツを正しいサイズに調整します(そして、「適切なサイズを見つける方法」という単純な方法で私の質問に答えますgetPreferredSize())。

ただし、コンテンツが収まるように初期サイズを十分に大きく設定する必要があります。そうしないと、レイアウトに配置されません。これは少し残念で、実際には「クリーン」ではありませんが、今のところ、それを回避する方法を見つけることができません。

編集:実際には、getPreferredSize()を呼び出す前であっても正しい値を返すため、デフォルトのサイズは必要ありませんでしdoLayout()た。そのため、layoutメソッドを呼び出す前に、パネルを適切なサイズに設定できます。

于 2010-02-09T10:59:34.857 に答える
1

直接の答えは、Window#pack()を呼び出すことです。このメソッドは、基になるすべての子のサイズを自動的に優先サイズに設定します(もちろん、これは子コンテナーのレイアウトに依存します。たとえば、BorderLayoutは、優先サイズについて気になりません)。

子コンポーネントの優先サイズ(またはレイアウトがBorderLayoutのような場合は最小/最大サイズ)を設定している限り、必要なのはpack()メソッドだけです。

[更新]
1つの方法は、jpanelにHierarchyListenerを追加し、HierarchyEvent #DISPLAYABILITY_CHANGEDイベントを確認することです。このイベントは、表示する準備ができている(そして親が利用可能である)パネルが認識されたときに呼び出されます。この時点で、次のことができます。

SwingUtilities#getWindowAncestor(myPanel).pack();

于 2010-02-09T09:29:07.643 に答える