带有JComboBox的Java JTable

我正在尝试将JComboBox放在JTable的某个列中。 我有这个代码,它正在工作:

model = new DefaultTableModel(); JComboBox optionComboCell = new JComboBox(); optionComboCell.addItem("Option 1"); optionComboCell.addItem("Option 2"); optionComboCell.setSelectedIndex(1); table = new JTable(model); // Adding here all the columns, removed for clarity model.addColumn("Options"); TableColumn optionsColumn = table.getColumn("Options"); optionsColumn.setCellEditor(new DefaultCellEditor(optionComboCell)); 

我的问题是,在选择该列中的单元格之前,它不会显示为JComboBox。 加载JFrame时,整个表看起来都一样,就好像所有单元格只有文本一样。 单击时,它会显示combobox的箭头和选项,但在取消选择时,它看起来像一个常规单元格。

有办法解决这个问题吗?

是的,使用JComboBox渲染您的单元格:

 import java.awt.Component; import java.util.Enumeration; import java.util.Vector; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class Test4 { private static class ComboBoxCellRenderer extends JComboBox implements TableCellRenderer { public ComboBoxCellRenderer(int column) { for (int i = 0; i < 10; i++) { addItem("Cell (" + i + "," + column + ")"); } } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setSelectedItem(value); return this; } } protected void initUI() { JFrame frame = new JFrame("test"); frame.add(getTable()); frame.pack(); frame.setVisible(true); } private Component getTable() { Vector> data = new Vector>(); for (int i = 0; i < 10; i++) { Vector row = new Vector(); for (int j = 0; j < 3; j++) { row.add("Cell (" + i + "," + j + ")"); } data.add(row); } Vector columns = new Vector(); columns.add("Column 1"); columns.add("Column 2"); columns.add("Column 3"); DefaultTableModel model = new DefaultTableModel(data, columns); JTable table = new JTable(model); table.setRowHeight(20); int i = 0; Enumeration c = table.getColumnModel().getColumns(); while (c.hasMoreElements()) { TableColumn column = c.nextElement(); column.setCellRenderer(new ComboBoxCellRenderer(i)); i++; } JScrollPane scroll = new JScrollPane(table); scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); return scroll; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Test4().initUI(); } }); } } 

您需要定义自己的渲染器以在表上显示组件,因为只需要CellEditors来编辑表格单元格中的值(这就是为什么它只会在您单击单元格时做出反应)。

或许可以查看Java教程 ,了解有关JTable的渲染器和编辑器概念的更多信息。

尝试也设置单元格渲染器。