2017-07-27 9 views
1

私のJavaアプリケーションでは、特定のJPanel(カスタムコントロール)が繰り返されている複雑なGUIを使用しています。実際には100倍もあります(実際はもっと多いかもしれませんが、この例を複雑すぎるようにしたい)。 これらの100個のJPanelには、ユーザーに特定の値を示す4つのJTextBoxコントロールが含まれています。GUIオブジェクトを再利用する方法(フライウェイトパターン)

1つのパネルのJTextBoxは空白になることがありますが、別のパネルでは値を持つことがありますが、他のすべてのボックスではいくつかの数字が表示され、アイデアを得ることができます。どのデータ。

今、メモリのフットプリントを減らすために、私はFlyweightデザインパターンについて学び始めました。それは私が必要とするもののようですが、JPanelを1つのシードとして保持し、それを使って他の99個のパネルを表現すると(JTextBoxの値を変更するだけで)、これらのパネルはすべて共通の参照を共有します。

その場合、そのうちの1つのJTextBox値を変更すると、他のすべての値も変更されます。 この問題を解決し、アプリケーションのメモリフットプリントを低く抑えるにはどうすればよいですか?

私に何か不足していますか? JListJTableJTree含む

+0

はい、この質問は簡略化されています。私の実際のアプリケーションでは、ユーザーは現在格納しているすべての可能なデータの概要を把握している必要があります。 – guest86

+1

"JTextBox"とは何ですか?より具体的にあなたの必要性のあなたの説明をしてください。スイングには既にJTableなどの軽量レンダラータイプのコンポーネントがありますが、それがあなたのニーズに合うかどうかは分かりません。 –

+0

MVCの研究をしたいかもしれない – MadProgrammer

答えて

2

多くの既存のSwingコンポーネントは、flyweight patternrender and editに細胞を使用しています。このJTableexampleにおいて、StatusPanelは、ButtonGroupを含み、JRadioButtonのいくつかのインスタンスは、enum Statusから選択された値を反映する。 StatusRendererの単一のインスタンスは、ステータス列の特定の行についてTableModelのステータスをレンダリングします。同様に、StatusEditorという単一のインスタンスでは、ステータス列の特定の行についてTableModelステータスを更新できます。具体的には、のみTableModelは、ビューの更新の間に実際にデータを格納します。レンダラーとエディターは各行に対して再利用されます。

image

既存のフライ級コンポーネントを使用できない場合は、このanswerは、アプローチの概要を説明し、完全な例を含んでいると役立つチュートリアルを挙げています。

image

+0

参照['BasicTableUI'](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/javax/swing/plas/basic/BasicTableUI.java)、これは 'paintCell()'の 'CellRendererPane'を使います。 – trashgod

関連する問題