Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】JTableのセルにJButtonを追加・挿入する方法を解説

JTableJComponentクラスのサブクラスであり、複数の行と列から構成されるテーブル形式のデータを表示するためのSwingコンポーネントです。JTable上で値が選択されるとTableModelEventが発生し、TableModelListenerインターフェースを実装することでそのイベントを処理できます。

JTableのセルにJButtonを追加・挿入したい場合は、DefaultTableModelAbstractTableModelのコードをカスタマイズするとともに、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】JTableのセルにJButtonを追加・挿入する方法を解説

  1. JavaのJButtonにショートカットキーを設定する方法をわかりやすく解説

    JButtonはAbstractButtonのサブクラスで、Java Swingアプリケーションにプラットフォームに依存しないボタンを追加するために使用されます。JButtonは、ボタンが押されたりクリックされたりしたときにActionListenerインターフェースを発生させることができ、さらにMouseListenerやKeyListenerインターフェースも発生させることが可能です。また、setMnemonic()メソッドを使用することで、JButtonにショートカットキー(ニーモニック)を簡単に設定できます。ニーモニックを設定すると、ユーザーはマウスを使わずにキーボードの組み合わせ(例

  2. JavaのJMenuからJTabbedPaneに新しいタブを追加する方法

    JTabbedPaneとはJTabbedPaneは、JComponentクラスを継承したSwingコンポーネントの一つで、複数のパネルをタブ形式で簡単に切り替えられるようにするUI部品です。各タブには1つのコンポーネントが関連付けられており、そのタブが選択されると対応するコンポーネントが表示されます。JTabbedPaneは、タブが選択されたタイミングでChangeListenerインターフェースを通じてイベントを発生させることができます。JTabbedPaneの主なメソッドには、add()、addTab()、fireStateChanged()、createChangeListener()、