JTable のセルに編集用のドロップダウンを設定する方法

ここでは、次の画面のように JTable のセルの値の編集時に、ドロップダウンを表示する方法を説明します。

前の記事「JTable のセルの値を更新するテーブルモデルの実装方法」では、 テーブルモデルで isCellEditable で true を返して編集可能として、 さらに setValueAt でデータをテーブルモデルに取り込む、ということを説明しました。

セル編集時はセルエディターで

セルを編集するときには「テーブルセルエディター」と呼ばれるオブジェクトが使われます。

セルを表示するときには「テーブルセルレンダラー」でしたが、編集する時はエディターです。 登場するモノは多いですが、役割分担がしっかりしていて、わかりやすいですね。

テーブルセルレンダラーについては、「JTable でのデータの表示方法を決める セルレンダラー」をみてください。

さっそく、上の画面の最初のカラムのセルエディターとして、ドロップダウンを表示するセルエディターをセットしてみましょう。

プログラムの全体の構成は「JTable のセルの値を更新するテーブルモデルの実装方法」で使ったコードと同様です。

セルエディターの実装

セルエディターは TableCellEditor インターフェイスを実装したクラスです。

javax.swing パッケージには TableCellEditor インターフェイスをはじめとして 必要な機能を実装した便利なデフォルトセルエディター (DefaultCellEditor クラス) が用意されています。

DefaultCellEditor はコンストラクタで、チェックボックス (JCheckBox)、 テキストフィールド (JTextField)、コンボボックス (JComboBox) のいずれかを受け取ります。

次のコードではコンボボックスを渡して DefaultCellEditor を作成し、 TableColumnsetCellRenderer メソッドでセルエディターをセットしています。

package com.keicode.java.testapp;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableColumn;

@SuppressWarnings("serial")
public class TableTest17 extends JFrame {
  public TableTest17() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(350, 150);

    JTable table = new JTable();
    MyTableModel3 tableModel = new MyTableModel3();
    table.setModel(tableModel);
    
    MyTableCellRenderer tableCellRenderer = new MyTableCellRenderer();
    TableColumn col = table.getColumnModel().getColumn(0);
    col.setCellRenderer(tableCellRenderer);
    
    // 最初のカラムにのセルエディターにドロップダウンを使用
    JComboBox<String> combo = new JComboBox<String>();
    combo.addItem("X");
    combo.addItem("Y");
    combo.addItem("Z");
    col.setCellEditor(new DefaultCellEditor(combo));
    
    JScrollPane scrollPane = new JScrollPane(table);
    add(scrollPane);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        TableTest17 app = new TableTest17();
        app.setVisible(true);
      }
    });
  }
}

これによって、上記でみたようにセルの編集時にドロップダウン(コンボボックス)が表示されるはずです。

ここではインラインで記述しましたが、セルエディターを再利用するには、デフォルトセルエディターのサブクラスを明示的に作成することも可能です。

package com.keicode.java.testapp;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;

@SuppressWarnings("serial")
public class MyCellEditor extends DefaultCellEditor {

  static JComboBox<String> combo = new JComboBox<String>();

  public MyCellEditor() {
    super(combo);
    combo.addItem("X");
    combo.addItem("Y");
    combo.addItem("Z");
  }
  
}

これでセルエディターをセットする箇所はシンプルになります。

col.setCellEditor(new MyCellEditor());

以上でセルの編集時にコンボボックスを使う方法を説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門