12

にコンポーネントを追加する前に呼び出してはならないことがこのサイトで何度も書かれているのを見てきました (ここここなど) 。setVisible(true)JComponent

これはなぜですか? また、ルールを破るとどうなりますか?

4

2 に答える 2

21

最初に呼び出しても何も壊れませんが、何かを追加した場合はおそらく再度呼び出す必要があります。それ以外の場合、Swing は追加されたコンポーネントをレンダリングしません。paint(...)JFrame のコンポーネントをレンダリングするには、JVM に JFrame のメソッドを呼び出させる必要があり、setVisible(true)JVM にこれを実行するように要求します。setVisible(true) を呼び出した後にコンポーネントを追加したことがあり、コンポーネントが表示されない場合は、JFrame のサイズを変更するとコンポーネントが「マテリアライズ」されることがわかります。これは、サイズを変更すると、オペレーティング システムが Swing に GUI の再描画を要求し、これがpaint(...)呼び出されるためです。

GUI を作成した後にコンポーネントを追加する場合は、そのコンテナーrevalidate()で頻繁repaint()に and を呼び出して、新しいコンポーネントを正しくレイアウトしてからレンダリングすることができます。コンポーネントの変更に削除が含まれる場合、または別のコンポーネントが以前に視覚化された場所にコンポーネントが描画されている場合、これrepaint()間違いなく必要です。

私が強くお勧めする本の提案:不潔なリッチクライアントはガイとハーセを購入します. 買うだけ!購入を後悔することはありません。

于 2012-05-28T21:17:03.933 に答える
7

@Hovercraftの有用な分析を増幅するとpack()、囲んでいるトップレベルのコンテナを再作成する必要がある場合もあります。afterに要素を追加するこのは、トレードオフを示している可能性があります。JListsetVisible()

于 2012-05-28T21:49:57.443 に答える