一个JTable单元格中的JComboBox

我有一个使用基于对象matrix的模型创build的JTable。 对于每一行,我想使用一个JComboBox来放置一个特定的列(第五个)一些信息。 我已经尝试了以下内容:

for(int i=0; i < n ; i++) { ..... data[i][5] = new JComboBox(aux); // aux is a Vector of elements I wanna insert } table.setModel(new MyTableModel()); // MyTableModel() already takes into consideration the data[][] object 

问题是data [i] [5] = new JComboBox(aux); 不在JTable的特定单元格中创buildJComboBox对象,而是将代码粘贴到行中。 我能做些什么来解决这个问题?

谢谢。

一种方法是重写getCellEditor()方法来返回适当的编辑器。 这里是一个例子,让你开始:

 import java.awt.*; import java.awt.event.*; import java.util.List; import java.util.ArrayList; import javax.swing.*; import javax.swing.table.*; public class TableComboBoxByRow extends JFrame { List<TableCellEditor> editors = new ArrayList<TableCellEditor>(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 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); } } 

编辑:代码更新为使用垃圾build议。

呵呵,不要像你提议的那样使用。

您必须创build一个自定义的TableCellRenderer或TableCellEditor。 然后,您可以指定将使用哪个类:

 JTable.setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer) JTable.setDefaultEditor(Class<?> columnClass, TableCellEditor editor) 

详细说明可以在这里find: http : //download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/components/table.html#combobox

对于特定行和列中的自定义渲染器,您可以简单地使用:

 final int specialRow = 1; final int specialColumn = 5; JTable table = new JTable(myModel) { private TableCellEditor mySpecialCellEditor = new SpecialCellEditor( ... ); public TableCellEditor getCellEditor(int row, int column) { int modelColumn = convertColumnIndexToModel(column); int modelRow = convertRowIndexToModel(row); if (modelColumn == specialColumn && row == specialRow ) { return mySpecialCellEditor; } else { return super.getCellEditor(row, column); } } }; 

尝试这样的事情:

  public void example(){ TableColumn tmpColum =table.getColumnModel().getColumn(1); String[] DATA = { "Data 1", "Data 2", "Data 3", "Data 4" }; JComboBox comboBox = new JComboBox(DATA); DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox); tmpColum.setCellEditor(defaultCellEditor); tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox)); table.repaint(); } /** Custom class for adding elements in the JComboBox. */ class CheckBoxCellRenderer implements TableCellRenderer { JComboBox combo; public CheckBoxCellRenderer(JComboBox comboBox) { this.combo = new JComboBox(); for (int i=0; i<comboBox.getItemCount(); i++){ combo.addItem(comboBox.getItemAt(i)); } } public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { combo.setSelectedItem(value); return combo; } } 

为了让JComboBox变得枯燥,你必须使用TableCellRenderer 。 看看使用combobox作为编辑器