isCellEditable
列を編集可能にするには、 のメソッドをオーバーライドする必要がありますTableModel
。TableModel
継承する場合、 を作成するのはかなり簡単です。AbstractTableModel
最も単純な を除くすべての に対してお勧めしJTable
ます。
ただし、 を適応させることTableModel
は、実行する必要があることの一部にすぎません。でカスタム コンポーネントを実際に取得するにはJTable
、カスタム セル レンダラーを設定する必要があります。インタラクティブなカスタム コンポーネントを使用するには、カスタム セル エディターを設定する必要があります。場合によっては、デフォルト クラスを少し変更したバージョンを使用するだけで十分です。
編集者
カスタム コンポーネントが既にある場合は、委任を使用して簡単に実行できます。 を実装する新しいクラスを作成し、メソッドでコンポーネントの新しいインスタンスをTableCellEditor
返します。このメソッドのパラメーターには、現在の値、セル座標、テーブルへのリンク、セルが選択されているかどうかが含まれます。getCellEditorComponent
には、ユーザーがセルのTableCellEditor
内容への変更をコミットする (ユーザー入力を検証してモデルを調整できる) とき、または編集をキャンセルするときに呼び出されるメソッドもあります。プログラムで編集を中止する場合は、必ずエディタでメソッドを呼び出してstopEditing()
ください。そうしないと、エディタ コンポーネントが画面に表示されたままになります。デバッグに 2 時間ほどかかったことがあります。
JTable
エディター内では、エディターのみがイベントを受け取ることに注意してください。ボタンの表示は、レンダラーを使用して行うことができます。ただし、機能するボタンを取得するには、正しいEventListeners
登録済みのエディターを実装する必要があります。レンダラーにリスナーを登録しても何も起こりません。
レンダラー
レンダラーを実装することは、質問で説明したことに対して厳密に必要というわけではありませんが、マイナーな変更のみの場合でも、通常はとにかくそれを行うことになります。エディターとは異なり、レンダラーは速度が重要です。レンダラーのgetTableCellRendererComponent
は、テーブル内のセルごとに 1 回呼び出されます。レンダラーによって返されるコンポーネントは、セルを描画するためにのみ使用され、対話には使用されないため、次のセルに「再利用」できます。つまり、レンダラーでコンポーネントを調整する必要があります (たとえば、setText(...)
またはを使用するsetFont(...)
場合)。新しいコンポーネントをインスタンス化しないでください。これは、パフォーマンスを低下させる簡単な方法です。TextComponent
注意事項
JTable
レンダラーとエディターを機能させるには、特定のレンダラー/エディターをいつ使用するかを伝える必要があることに注意してください。これを行うには、基本的に 2 つの方法があります。それぞれのメソッドを使用して、特定のタイプのデフォルトのセル レンダラー/エディターを設定できます。JTable
この方法を機能TableModel
させるには、メソッドで正確にこのタイプを返す必要がありますgetColumnClass(...)
! デフォルトのテーブル モデルはこれを行わず、常に を返しますObject.class
。多くの人を困惑させてきた一人だと確信しています。
エディター/レンダラーを設定するもう 1 つの方法は、列自体に明示的に設定することです。つまり、 のメソッドをTableColumn
介してを取得します。これはかなり複雑ですが、1 つのクラスに対して 2 つの異なるレンダラー/エディターを持つ唯一の方法でもあります。たとえば、あなたのモデルはクラス String の 2 つの列を持ち、それらはまったく異なる方法でレンダリングされます。たとえば、1 つは を使用し、もう 1 つは を使用して、より精巧なエディターにアクセスします。getTableColumn(...)
JTable
JLabel/DefaultRenderer
JButton
JTable
カスタム レンダラーとエディターを使用すると、非常に汎用性が高くなりますが、取り入れなければならないことも多く、間違っていることもたくさんあります。幸運を!
Swing チュートリアルでのテーブルの使用方法は、JTable をカスタマイズするすべての人にとって必読です。特に、Concepts: Editor and Renderersを読んで読み直してください。「クリック」するのに通常は時間がかかるためです。カスタム レンダラーとエディターの例も非常に価値があります。