JavaのTableCellRendererとTableCellEditorの違いとは?使い方をわかりやすく解説
Java SwingのJTableを扱う際、「TableCellRenderer」と「TableCellEditor」という2つの重要なインターフェースが登場します。名前が似ているため混同されやすいのですが、役割はまったく異なります。
簡単に言えば、TableCellRendererはセルの「表示」を担当し、TableCellEditorはセルの「編集」を担当します。本記事では、それぞれの特徴と使い分けのポイントを解説します。
TableCellRenderer(セルの描画)とは
- TableCellRendererは、JTableの各セルに値を表示するためのコンポーネントを生成するインターフェースです。
- デフォルトのレンダラーはJLabelを使用して、各セルの値を表示します。
- TableCellRendererは主に2つの方法で指定できます。1つ目は、描画対象オブジェクトのクラス単位でtable.setDefaultRenderer()メソッドを使って指定する方法。2つ目は、特定の列に対してtableColumn.setCellRenderer()メソッドを使って指定する方法です。さらに、列ヘッダーにはtableColumn.setHeaderRenderer()メソッドでヘッダー専用のレンダラーを設定することもできます。
- TableCellRendererインターフェースにはgetTableCellRendererComponent()メソッドが1つだけ定義されています。このメソッドは、セルの値やフォーカスの有無、選択状態、行・列の情報に応じて、異なる描画コンポーネントを返すことができます。
TableCellEditor(セルの編集)とは
- TableCellEditorはインターフェースであり、デフォルトではセルは編集可能な状態になっています。
- セルが編集可能かどうかは、TableModelのisCellEditable()メソッドを呼び出して判定されます。
- セルの値のクラスがBooleanの場合はJCheckBoxが使用され、ダブルクリックで編集モードに入る必要がある場合はJTextFieldが使用されます。
- TableCellEditorインターフェースにはgetTableCellEditorComponent()メソッドが1つだけ定義されています。このメソッドは、セルの値や選択状態、行・列の情報に応じて、異なる編集コンポーネントを返すことができます。
サンプルコード
以下は、複数行テキストを扱うためにJTextAreaを組み込んだカスタムレンダラーとエディターを実装した例です。左側の「Renderer」列は編集不可、右側の「Editor」列は編集可能になっています。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableCellRendererEditorTest extends JFrame {
private JTable table;
public TableCellRendererEditorTest() {
setTitle("TableCellRendererEditor Test");
DefaultTableModel dtm = new DefaultTableModel() {
public boolean isCellEditable(int row, int column) {
return !(column == 0);
}
};
dtm.setDataVector(new Object[][]{{"Table Cell Renderer", "Table Cell Editor"}, {"Table Cell Renderer","Table Cell Editor"}}, new Object[]{"Renderer","Editor"});
table = new JTable(dtm);
table.getColumn("Editor").setCellRenderer(new TextAreaRenderer());
table.getColumn("Editor").setCellEditor(new TextAreaEditor());
table.setRowHeight(80);
JScrollPane spane = new JScrollPane(table);
add(spane);
setSize(400, 275);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new TableCellRendererEditorTest();
}
}
class TextAreaRenderer extends JScrollPane implements TableCellRenderer {
JTextArea textarea;
public TextAreaRenderer() {
textarea = new JTextArea();
textarea.setLineWrap(true);
textarea.setWrapStyleWord(true);
getViewport().add(textarea);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
textarea.setForeground(table.getSelectionForeground());
textarea.setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
textarea.setForeground(table.getForeground());
textarea.setBackground(table.getBackground());
}
textarea.setText((String) value);
textarea.setCaretPosition(0);
return this;
}
}
class TextAreaEditor extends DefaultCellEditor {
protected JScrollPane scrollpane;
protected JTextArea textarea;
public TextAreaEditor() {
super(new JCheckBox());
scrollpane = new JScrollPane();
textarea = new JTextArea();
textarea.setLineWrap(true);
textarea.setWrapStyleWord(true);
scrollpane.getViewport().add(textarea);
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
textarea.setText((String) value);
return scrollpane;
}
public Object getCellEditorValue() {
return textarea.getText();
}
}
実行結果

まとめ
TableCellRendererはセルの見た目(表示)を制御し、TableCellEditorはユーザーによる入力(編集)を制御します。両者は密接に連携しながら動作しており、たとえばチェックボックスによる真偽値の表示・編集や、複数行テキストの編集など、用途に応じてカスタマイズすることで、より使いやすいテーブルUIを構築できます。
-
JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説
JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ
-
JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント
JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ