ラバースタンピングを行わない場合は、実際のコンポーネントを使用する独自の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コントロールを実装するだけで、さまざまな設計上の決定を簡単に行うことができます。いずれにしても、あなたが必要とすることは、スイングがうまく動くようにすることができます。
ここ – mKorbel
をhttp://sscce.org/投稿してくださいあなたは本当にスイングMVCのより良い理解を必要とします。必要なものはすべて既に利用可能になっています。あなたのエンティティを説明するためにすべてをまとめておく方法を知る必要があります。 – mre
ええ。私のSwingの知識は完璧ではなく、部品から構成要素を構築することが可能であることがわかりますが、安定したテスト済みの実装が存在することを願っています。私は今夜自転車を再開発したくありません。 –