Jtable具有不同类型的单元格,具体取决于数据类型

如何根据特定行显示的输入类型实现具有不同类型的单元格编辑器的JTable?

例如

  • 一些行可以是复选框(对于布尔类型)
  • 有些行可能是combobox(如果我想提供一组固定的选项可供选择)
  • 某些行可以是文本字段(如果我允许任意数据)。

目前我已经实现了AbstractTableModel ,它从我的对象中获取一组自定义字段对象,并向表中添加行。 我想通过设置特定类型的单元格来进一步自定义我的表格。 我可以根据行包含的字段类型确定要使用的单元格类型。

表模型是在运行时动态创建的。

  • 一些行可以是复选框(对于布尔类型)
  • 有些行可能是combobox(如果我想提供一组固定的选项可供选择)
  • 某些行可以是文本字段(如果我允许任意数据)。

例如

在此处输入图像描述

 import java.awt.EventQueue; import java.util.Date; import javax.swing.JFrame; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; public class EachRowRendererEditor { private JFrame frame = new JFrame("EachRowRendererEditor"); private String[] columnNames = {"Type", "Value"}; private Object[][] data = { {"String", "I'm a string"}, {"Date", new Date()}, {"Integer", new Integer(123)}, {"Double", new Double(123.45)}, {"Boolean", Boolean.TRUE}}; private JScrollPane scrollPane; private JTable table; public EachRowRendererEditor() { table = new JTable(data, columnNames) { private static final long serialVersionUID = 1L; private Class editingClass; @Override public TableCellRenderer getCellRenderer(int row, int column) { editingClass = null; int modelColumn = convertColumnIndexToModel(column); if (modelColumn == 1) { Class rowClass = getModel().getValueAt(row, modelColumn).getClass(); return getDefaultRenderer(rowClass); } else { return super.getCellRenderer(row, column); } } @Override public TableCellEditor getCellEditor(int row, int column) { editingClass = null; int modelColumn = convertColumnIndexToModel(column); if (modelColumn == 1) { editingClass = getModel().getValueAt(row, modelColumn).getClass(); return getDefaultEditor(editingClass); } else { return super.getCellEditor(row, column); } } // This method is also invoked by the editor when the value in the editor // component is saved in the TableModel. The class was saved when the // editor was invoked so the proper class can be created. @Override public Class getColumnClass(int column) { return editingClass != null ? editingClass : super.getColumnClass(column); } }; table.setPreferredScrollableViewportSize(table.getPreferredSize()); scrollPane = new JScrollPane(table); frame.add(scrollPane); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { EachRowRendererEditor eeee = new EachRowRendererEditor(); } }); } } 

创建一个实现javax.swing.table.TableCellRenderer的自定义类,该类使用您要显示的控件显示值,具体取决于数据类型。 将此类的实例用作单元格渲染器(TableColumn.setCellRenderer)