将JComboBox放入JTable

Dan*_*Dan 15 java jtable jcombobox

我想将各个JComboBox放入JTable的每个单元格中.即.每个单元格的JComboBox内容并不相同.

我基本上希望能够只调用以下代码将一行JComboBox添加到JTable中.任何人有任何想法?谢谢

JComboBox cb1 = new JComboBox(...);
JComboBox cb2 = new JComboBox(...);
model.addRow(new Object[] {"Row name", cb1, cb2} );

JComboBox cb3 = new JComboBox(...);
JComboBox cb4 = new JComboBox(...);
model.addRow(new Object[] {"Row name 2", cb3, cb4} );
Run Code Online (Sandbox Code Playgroud)

我能找到的最接近的示例代码如下.但是对于单个列的JComboBox内容是相同的.不是我需要的解决方案.

TableColumn col = table.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new MyComboBoxEditor(values));
Run Code Online (Sandbox Code Playgroud)

哪里

public class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 9

使用以下代码扩展JTable:

@Override
public TableCellEditor getCellEditor(int row, int column) {
   Object value = super.getValueAt(row, column);
   if(value != null) {
      if(value instanceof JComboBox) {
           return new DefaultCellEditor((JComboBox)value);
      }
            return getDefaultEditor(value.getClass());
   }
   return super.getCellEditor(row, column);
}
Run Code Online (Sandbox Code Playgroud)

这将为您获得值的每个组合框创建一个唯一的JComboBox单元格编辑器.

  • +1 - 一个也应该在相应列的`TableColumnModel`上设置一个自定义`TableCellRenderer`,以确保绘制选定的值而不是字符串`javax.swing.JCombobox [...]`单元格未被编辑.这个`TableCellRenderer`应该实现`getTableCellRendererComponent(..)`并且可以返回一个`JLabel`,其值为`JComboBox.getSelectedItem().toString()`(在检查空指针之后). (3认同)

Cog*_*gsy -8

最简单的方法是实现自己的TableModel

public class MyModel extends AbstractTableModel {
    List rows;

    public int getRowCount() {
        return rows.size();
    }

    public int getColumnCount() {
         return 4;
    }

    public Object getValueAt(int row, int column) {
        return rows.get(row).getCol(col);  //assuming your row "Object" has a getCol()
    }

    public Class<?> getColumnClass(int col) {
        return Boolean.class;
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        rows.get(rowIndex).getCol(columnIndex).setValue(aValue);
    }

}
Run Code Online (Sandbox Code Playgroud)

将其加载到您的 JTable 中。如果您尚未替换布尔值的默认单元格渲染器,则由于 getColumnClass() 的实现,所有单元格都将呈现为复选框。这些复选框的所有用户输入均通过我们的 setValueAt() 收集。

  • 呃,他问的是 JComboBox,而不是 JCheckBox。这个答案是如何被接受的? (20认同)