如何在JTable中为一列添加不同的单元格编辑器?

我有一个带有两列的JTable,两者都是JComboBox,为此我实现了自己的Model和overrode方法。 我覆盖的方法之一是:

public Class getColumnClass(int index) { return JComboBox.class; } 

还创建了我自己的ComboBoxEditor和ComboBoxRender类,并设置了cellEditor和cellRenderer:

 column.setCellEditor(new ComboBoxEditor()); column.setCellRenderer(new ComboBoxRenderer()); 

现在我想进行更改,因此对于第一列,一些单元格是JComboBox,一些单元格是标准文本数据。

我怎样才能做到这一点?

任何有用的建议都会受到欢迎

您需要实现自己的javax.swing.table.TableCellRenderer ,根据您的业务逻辑getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)返回不同的渲染器。 TableCellEditor接口也是如此。

我通常覆盖table.getCellEditor(…)方法以返回适当的编辑器。

也许是这样的:

 import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.table.*; public class TableComboBoxByRow extends JFrame { ArrayList editors = new ArrayList(3); public TableComboBoxByRow() { // Create the editors to be used for each row String[] items1 = { "Red", "Blue", "Green" }; JComboBox comboBox1 = new JComboBox( items1 ); DefaultCellEditor dce1 = new DefaultCellEditor( comboBox1 ); editors.add( dce1 ); String[] items2 = { "Circle", "Square", "Triangle" }; JComboBox comboBox2 = new JComboBox( items2 ); DefaultCellEditor dce2 = new DefaultCellEditor( comboBox2 ); editors.add( dce2 ); String[] items3 = { "Apple", "Orange", "Banana" }; JComboBox comboBox3 = new JComboBox( items3 ); DefaultCellEditor dce3 = new DefaultCellEditor( comboBox3 ); editors.add( dce3 ); // Create the table with default data Object[][] data = { {"Color", "Red"}, {"Shape", "Square"}, {"Fruit", "Banana"}, {"Plain", "Text"} }; String[] columnNames = {"Type","Value"}; DefaultTableModel model = new DefaultTableModel(data, columnNames); JTable table = new JTable(model) { // Determine editor to be used by row public TableCellEditor getCellEditor(int row, int column) { int modelColumn = convertColumnIndexToModel( column ); if (modelColumn == 1 && row < 3) return (TableCellEditor)editors.get(row); else return super.getCellEditor(row, column); } }; System.out.println(table.getCellEditor()); JScrollPane scrollPane = new JScrollPane( table ); getContentPane().add( scrollPane ); } public static void main(String[] args) { TableComboBoxByRow frame = new TableComboBoxByRow(); frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setVisible(true); } } 

你可以使用instanceof 。 用法:

 Object o = new String("Test"); if (o instanceof String) { String s = (String) o; // Do something with the string } 

因此,为您的JTable创建数据矩阵,如此Object[][] data = new Object[...][...]
然后,Ent可以在DefaultTableCellRenderer使用instanceof来检查Object是String还是JComboBox 。 根据该结果,渲染为StringJComboBox

也许如果你使用自己的表模型,覆盖setValueAt(Object value, int row, int col)方法并尝试转换其中的输入数据会更方便。

我即将在我的代码中使用此解决方案。 有没有人看到这种方法的问题?