15

StackOverflow では、ユーザーがこのような質問をすることが何度もありました...

JPanelchild を含むmainがありますJPanel。ユーザーがボタンをクリックすると、子JPanelは別の に変更されますJPanel。どうすればこれを達成できますか。

多くの場合、ユーザーは実際にこの問題を実装しようとしましたが、機能させることができません。

この質問に答えるときはいつでも、このようなことをするように言います(簡単に言えば)...

JPanel myFrame = new JPanel();
myFrame.remove(oldPanel);
myFrame.add(newPanel);

これは非常に正当な答えだと思います。個人的には、これを自分の Java プロジェクトの多くで問題なく使用しています。しかし、私はいつも私の答えに反対票を投じており、誰もが「使用するCardLayout」と言っています。

だから私の質問は、なぜ誰もCardLayoutが私の答えに反対票を投じるに値するほどに魅了されているのですか? CardLayout上記のコードを使用してパネルを追加/削除するのではなく、使用することを選択する必要があるのはなぜですか?

CardLayoutさらなる質問として、動的な JPanels を持つインターフェイスを引き続き提案していただけますか。たとえば、私のプログラムのほとんどはカスタム プラグイン フレームワークを実装しており、何百ものJPanels. プログラムの通常の使用では、ほとんどのパネルが実際に読み込まれたり必要になったりすることはありません。このタイプのシナリオでは、私のコーディング アプローチが最善の解決策CardLayoutでしょうJPanelsか?

4

2 に答える 2

15
  • CardLayoutを使用すると、結合度を緩めるのが簡単になります(ただし、自分でロールすることは不可能ではありません)。
  • CardLayoutでは、カード所有者のpreferredSizeは、保持している最大のカードのサイズです。
  • CardLayoutは、実行するのが難しく、ほとんど些細な連続コンポーネントでそのメソッドnext()prev()メソッドを交換できます。
  • 目的のコンポーネントを定数に簡単に関連付けることができMap<String, Component>ます。この目的のためにを作成する必要はありません。これはすでに存在しているためです。私はこれに列挙型を頻繁に使用していません。
  • コンポーネントを交換するときに呼び出すことrepaint()を覚えておく必要はありません。revalidate()
  • これは、コンポーネントを簡単に再利用できるように構築されています。

反対票を投じた理由を説明することはできませんが、彼らが動揺していない限り、電話をかける必要があることrepaint()revalidate()、コンポーネントを交換するときのことを忘れないでください。あなたは彼らが応答するのに十分勇敢であるかどうか反対投票者に尋ねなければならないでしょう。

于 2012-05-22T01:16:28.793 に答える
8

CardLayout徹底的にテストされ、動作することが証明されています。コンポーネントツリーロックを正しく取得し、コンポーネントの検証を実行して、問題が発生しないことを確認します。ソリューションはほとんどの場合機能する可能性がありますが、特定の状況では失敗します。

これはすべて、車輪の再発明に帰着します。そのような定評のあるクラスがすでに利用可能であるのに、なぜあなたはそうしたいのですか?

于 2012-05-22T01:18:33.877 に答える