2010-12-20 5 views
1

JTableでカスタムセルを作成したいと思います。カスタムレンダラーを使用してJPanelオブジェクトを返しました。 これは動作しますが、問題が1つあります。プログラムが実行されている間、JPanelはpaintComponent()メソッドを使用して描画します。それぞれの "tick"(通常は100ms)ごとにパネルが広くなっています(私はm drawing kind of graph) and when it becomes too big the rest is just hidden. Iスクロールバーをサイズ変更して作成するのが好きですが、ScrollPaneを置く方法はいくつかありましたが、どちらもうまくいきませんでした。 VisualVM。任意のアイデア?JTableセルのスクロール可能なJPanel

+1

も参照してください。http://stackoverflow.com/questions/4167452 – trashgod

答えて

1

テーブル内のすべてのセルをレンダリングするために1つのコンポーネントしか使用されていないので、スクロールペインを通常のテーブルセル内に配置するのは難しい作業です.JTableを削除して、通常のJPanelレイアウト

それでもJTableのを使用したい場合:?。

すべてのスクロールペイン特別JViewportのコントロールが含まれている。このJViewportの制御は、実際には、すべてのwoはスクロールしますrk、およびJSrollPane自体は、スクロールバーでレイアウトします。単一のビューポートはすべてのセルに使用されるため、このビューポートのスクロール位置のどこかに格納し、すべてのペイントセル(getCellRendererメソッドの場合)に復元する必要があります。しかし、JSrollPaneは非常に遅いソリューションなので、レイアウトが重い作業が必要です。

JPaneセルレンダラーのペイントメソッドをオーバーライドして、適切なスクロールオフセットでサブグラフィックス(Graphics.create())を作成する必要があります。スクロールオフセットデータは、どこかに格納する必要があります(テーブルモデルなど)。ユーザがセルをクリックすると、JTableはセル編集を開始し、セルエディタをインストールします。これは特殊なセルエディタでなければならず、スクロールペイン自体が含まれています。ユーザーはこのコントロールをスクロールし(特別なサポートは必要ありません)、スクロール位置をモデルに保存する必要があります(stopCellEditing()関数内)。次に、セルレンダリングされたペイント自体とペイントメソッドは、モデルからコンテンツスクロールオフセットを取得します。ユーザーがスクロールしたセルを参照します。レンダリングされたセルの中にJScrollBarを置くことができるので、ユーザーはスクロール位置を見ることができます(しかし特別なサポートが必要です)。また、JViewport自体を使用してすべての痛みの作業を行うことはできますが、理解しにくいコントロールで行うことができます。私はセルエディタでスクロールパンツを使うのに悩むことはありませんので、うまくいくはずです。いずれにせよ、それは巨大な仕事です。

0

カスタムテーブルセルレンダラーを設定しました。このレンダラーがにあるJScrollPaneビューであると仮定しています。スクロールペインでsetPreferredSize()への呼び出しを行い、パネル上でsetPreferredSize()および/またはsetSize()(またはスクロールペインで表示されている内部要素)を呼び出してから、validate()を呼び出してレイアウトを更新する必要があります。