如何在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
。 根据该结果,渲染为String
或JComboBox
。
也许如果你使用自己的表模型,覆盖setValueAt(Object value, int row, int col)
方法并尝试转换其中的输入数据会更方便。
我即将在我的代码中使用此解决方案。 有没有人看到这种方法的问题?