2011-12-21 10 views
-1

私は、各エンティティがJPanelに基づいてウィジェットにレンダリングするエンティティのリストを持っています。ウィジェットには動的な振る舞いがあります。いったんパネルに配置すると、そのウィジェットは基になるエンティティによって変更できます。これは自動で起こります。さらに、ボタンのクリックなど、さまざまなアクションによってウィジェットのサイズを変更することができます。動的JListの実装

質問は、JListのようなものに整理する方法ですが、ゴム印の技術はありません。言い換えれば、私はJListとしたいのですが、cellrendererでレンダリングされた各アイテムは "生き続ける"ことができます。

今私が垂直BoxLayoutJPanelに基づいて間に合わせや部品を実装して、それがJList'sレンダリングコンポーネントと、それのモデルを使用しています...しかし、私の実装があまりにも汚いです...

うーん...ええJTableを使用しても適切ではありません。

アイデアはありますか?

+0

ここ – mKorbel

+0

をhttp://sscce.org/投稿してくださいあなたは本当にスイングMVCのより良い理解を必要とします。必要なものはすべて既に利用可能になっています。あなたのエンティティを説明するためにすべてをまとめておく方法を知る必要があります。 – mre

+0

ええ。私のSwingの知識は完璧ではなく、部品から構成要素を構築することが可能であることがわかりますが、安定したテスト済みの実装が存在することを願っています。私は今夜​​自転車を再開発したくありません。 –

答えて

0

ラバースタンピングを行わない場合は、実際のコンポーネントを使用する独自のJList実装を作成する必要があります。

レンダラーの各行に各コンポーネントをキャッシュして値をバインドし、JListがそのレンダラーにレンダリングを依頼したときにそのインスタンスを返すことで、ラバー・スタンプ・エフェクトを回避できます。これは非常に危険です。なぜなら、表示されている行が20行ある場合、レンダラーに20個のインスタンスをキャッシュする必要があり、行が表示されていないときだけ、再利用できます。つまり、タイプA、タイプB、タイプC、タイプDの3つのユニークな構成(A、B、C、D、E)があり、タイプが0 Eが表示されます。ただし、表示されているかどうかを知らなくても、コンポーネントの1つを再利用することはできません。したがって、行が表示されている場合、およびそれがレンダリングしている行に適切なタイプであるかどうかを考慮する必要があります。そして行が隠された後にあなたはきれいにする必要があります。

もう1つのオプションは、あなたが持っているすべてのXバリエーションをカプセル化してCardLayoutに配置する行の単一のコンポーネントを作成することです。次に、表示されている行ごとにキャッシュするだけで、その行の表示時に表示されているカードを交換することができます。私はそれがあなたにとって最も簡単な選択肢かもしれないと思います。

ハードな部分はイベントをルーティングすることになりますが、マウスクリックやキーボードイベントなどをアクティブなコンポーネントにクリックすると、通常のコンポーネントのように応答します。ユーザーがクリックしたときにボタンを再レンダリングするなどの作業は難しいでしょう。不可能ではありませんが、面倒です。

最後に、可変行の高さJListは痛みです。特に、行が表示されているかどうかを調べるための計算では、次のような単純な計算を行うことができないためです。int rowHeight = jlist.getHeight/model.size()。それは動作しません。行が表示されているかどうかを調べるには、各行の高さとそれらを計算する必要があります。

あなたが話していることは、たくさんの作業であり、JListの前提のいくつかを回避して動作させるためには非常にトリッキーなコーディングです。最終的に、独自のListコントロールを実装するだけで、さまざまな設計上の決定を簡単に行うことができます。いずれにしても、あなたが必要とすることは、スイングがうまく動くようにすることができます。

+0

うん。 JListのソースをすばやく調べると、現時点では既存のコンポーネントをベースにするのが難しいことがわかります。私のスイングの知識はあまり深くない。私が以前に書いたように、レイアウト、scrollpanel、jpanelに基づいたバグのある回避策を実装しています。しかし、私はまだ前に誰かがすでにそのような問題に会ったことを願っています –

0

私はそのようなコンポーネントの実装を見つけることはありません。最初のものにしよう。 https://github.com/wertlex/JActiveList

P.S.私はこれが適切な方法の実装だとは思わない...しかし、それは動作します。

-1

早いほど良いの助けのために使用するJListとActionListenerのXD

+0

何をどのように正確に行うには? -1 – kleopatra

関連する問題