【Java】JTableのセルにJButtonを追加・挿入する方法を解説
JTableはJComponentクラスのサブクラスであり、複数の行と列から構成されるテーブル形式のデータを表示するためのSwingコンポーネントです。JTable上で値が選択されるとTableModelEventが発生し、TableModelListenerインターフェースを実装することでそのイベントを処理できます。
JTableのセルにJButtonを追加・挿入したい場合は、DefaultTableModelやAbstractTableModelのコードをカスタマイズするとともに、TableCellRendererインターフェースを実装し、getTableCellRendererComponent()メソッドをオーバーライドする必要があります。以下に具体的なサンプルコードを示します。
実装例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTableButtonTest extends JFrame {
private JTable table;
private JScrollPane scrollPane;
public JTableButtonTest() {
setTitle("JTableButton Test");
TableCellRenderer tableRenderer;
// 独自モデルを持つJTableを生成
table = new JTable(new JTableButtonModel());
// デフォルトのレンダラーを取得して独自レンダラーでラップ
tableRenderer = table.getDefaultRenderer(JButton.class);
table.setDefaultRenderer(JButton.class, new JTableButtonRenderer(tableRenderer));
scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args) {
new JTableButtonTest();
}
}
// セルにコンポーネント(JButton)を描画するレンダラー
class JTableButtonRenderer implements TableCellRenderer {
private TableCellRenderer defaultRenderer;
public JTableButtonRenderer(TableCellRenderer renderer) {
defaultRenderer = renderer;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Component)
return (Component)value; // 値がComponentならそのまま返す
return defaultRenderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
}
}
// JButtonをデータとして保持するテーブルモデル
class JTableButtonModel extends AbstractTableModel {
private Object[][] rows = {{"Button1", new JButton("Button1")},
{"Button2", new JButton("Button2")},
{"Button3", new JButton("Button3")},
{"Button4", new JButton("Button4")}};
private String[] columns = {"Count", "Buttons"};
public String getColumnName(int column) {
return columns[column];
}
public int getRowCount() {
return rows.length;
}
public int getColumnCount() {
return columns.length;
}
public Object getValueAt(int row, int column) {
return rows[row][column];
}
public boolean isCellEditable(int row, int column) {
return false;
}
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
}
コードのポイント
- JTableButtonModel:AbstractTableModelを継承したモデルクラスです。各行のデータとして文字列とJButtonオブジェクトを保持しており、getColumnClass()がJButton.classを返すことで、該当列に専用のレンダラーが適用されます。
- JTableButtonRenderer:TableCellRendererを実装したレンダラークラスです。セルの値がComponentインスタンスであればそれをそのまま返してボタンを描画し、そうでない場合はデフォルトのレンダラーへ処理を委譲します。
- JTableButtonTest:JFrameを継承したメインクラスです。getDefaultRenderer(JButton.class)で取得したデフォルトレンダラーを独自レンダラーでラップし、setDefaultRenderer()メソッドで登録しています。
なお、この方法で表示されるボタンはあくまで「見た目」として描画されるものです。実際にクリック操作を有効にするには、TableCellEditorの実装やMouseListenerによるイベント処理を追加で組み合わせる必要があります。
実行結果

-
JavaのJButtonにショートカットキーを設定する方法をわかりやすく解説
JButtonはAbstractButtonのサブクラスで、Java Swingアプリケーションにプラットフォームに依存しないボタンを追加するために使用されます。JButtonは、ボタンが押されたりクリックされたりしたときにActionListenerインターフェースを発生させることができ、さらにMouseListenerやKeyListenerインターフェースも発生させることが可能です。また、setMnemonic()メソッドを使用することで、JButtonにショートカットキー(ニーモニック)を簡単に設定できます。ニーモニックを設定すると、ユーザーはマウスを使わずにキーボードの組み合わせ(例
-
JavaのJMenuからJTabbedPaneに新しいタブを追加する方法
JTabbedPaneとはJTabbedPaneは、JComponentクラスを継承したSwingコンポーネントの一つで、複数のパネルをタブ形式で簡単に切り替えられるようにするUI部品です。各タブには1つのコンポーネントが関連付けられており、そのタブが選択されると対応するコンポーネントが表示されます。JTabbedPaneは、タブが選択されたタイミングでChangeListenerインターフェースを通じてイベントを発生させることができます。JTabbedPaneの主なメソッドには、add()、addTab()、fireStateChanged()、createChangeListener()、