2012-05-22 18 views
14

CardLayoutとJPanelの手動追加/削除の違いは何ですか?

は、私が子供 JPanelを含むメイン JPanelを持っている...ユーザがこのような質問をStackOverflowの上で何度もありました。ユーザーが ボタンをクリックすると、子 JPanelは別の JPanelに変更されます。どのようにすれば これを達成できますか?

多くの場合、ユーザーは実際にこの問題を実装しようとしましたが、動作させることはできません。私はこの質問に答えるたびに、私はこのような何か(簡単に言えば)を行うためにそれらを教え

...

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

私はかなり合法的な答えとしてこれを見て、私は個人的の多くで、これを使用しています自分のJavaプロジェクトに問題はありません。しかし、私はいつも私の答えのために下降音を受け取り、誰もが "CardLayoutを使う"と言うだけです。

私の質問は、誰もがなぜCardLayoutに魅了されているのですか?上記のコードを使用してパネルを追加/削除するのではなく、なぜCardLayoutを使用するのですか?

さらに詳しい質問として、動的JPanelsを持つインターフェイスのためにCardLayoutを提案してください。たとえば、ほとんどのプログラムでは、何百ものJPanelsが存在するカスタムプラグインフレームワークが実装されていますが、パネルは実際に必要なときだけロードして表示します。プログラムの通常の使用のために、パネルのほとんどが実際にロードされたり、必要とされることはありません。このタイプのシナリオでは、CardLayoutは、ほとんどが使用されないにもかかわらず実際にJPanelsのすべてを作成する必要があることを理解しているので、私のコーディング手法は最良の解決策でしょうか? CardLayoutで

+6

あなたは建設的な方法であなたの質問を表現する良い仕事をしたと思います。私はそれが閉じられないことを願っています。 –

+0

ありがとう - 私は意図的にそれを建設的な質問にしようとしました、そして良いフィードバックを得ることはうれしいです。 – wattostudios

+4

* "実際に必要なだけのパネルをロードして表示するだけです。" *レイジーインスタンシエーションは 'CardLayout'でも使用でき、1000sのパネルをサポートしています。 –

答えて

14
  • 、それはCardLayoutで疎結合(ロールと不可能ではない、あなた自身が)
  • を持っている方が簡単です、カードホルダーのpreferredSizeが、それが保持している最大のカードのことです。
  • CardLayoutは、ファックアップするのが難しく、next()prev()のメソッドをほとんどほとんど使用しない連続的なコンポーネントスワップが可能です。
  • 目的のコンポーネントを定数に簡単に関連付けることができます。この目的のために、既に存在するため、Map<String, Component>を作成する必要はありません。私は頻繁にこれのために列挙を使用したことはありません。
  • コンポーネントを交換するときは、repaint()revalidate()に電話する必要はありません。
  • これは、コンポーネントを簡単に再利用できるように構築されています。

彼らはあなたが部品を交換する際repaint()revalidate()を呼び出すために覚えておく必要性を言及しなかった動揺しない限り、私は、しかしダウン投票の理由を説明することはできません。あなたがダウンタウンに勇気があるかどうかを尋ねなければなりません。

+2

大きな反応をお寄せいただき、ありがとうございました。私はこれらの点のいくつかについて感傷的でした。そして、 'CardLayout'を使用するための数多くの良いケースを提示します。 – wattostudios

+2

関連する例は、[ここ](http://stackoverflow.com/a/5655843/230513)および[ここ](http://stackoverflow.com/a/6432291/230513)で見つけることができます。 – trashgod

+0

@Watto:ようこそ! –

8

CardLayoutが完全にテストされ、動作することが証明されています。 component-tree lockを正しく取得し、何も問題が生じないようにするために、コンポーネントvalidationを実行します。あなたのソリューションは、ほとんどの場合には動作しますが、特定の状況では失敗します。

これはすべて、ホイールを再発明するのに沸騰します。なぜ、このようなタイムテスト済みのクラスがすでに利用可能になったのですか?

+1

ええ、良いアドバイス1 + –

+1

これはあなたのフィードバックのおかげで、いくつかの良い点もあげています。私はそれが失敗に対して何らかの保証を提供するのに役立つだろうと確信できます。車輪を再発明することに関しては、私は「CardLayout」が私の目的に適しているとは思っていませんでした。Javaの低レベルではかなりの量の微妙な調整をしていますので、本当に大きな飛躍ではありませんでした下位の 'add()'/'remove()'オプションを使います。良い点をありがとう! – wattostudios

関連する問題