15

我想将单个 JComboBoxes 放入 JTable 的每个单元格中。IE。每个单元格的 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} );

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

TableColumn col = table.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new MyComboBoxEditor(values));

在哪里

public class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}
4

9 回答 9

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);
}

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

于 2009-06-03T20:13:14.717 回答
3

我相信这会解决你的问题。提及您需要在 .getColumn(int column) 中设置组合框的列

private void addComboToTable(JComboBox combo) {
    TableColumn gradeColumn = YourTable.getColumnModel().getColumn(0);
    JComboBox comboBox = combo;
    comboBox.removeAllItems();
    try {
        comboBox.addItem("Item 1");
        comboBox.addItem("Item 2");
        comboBox.addItem("Item 3");
    } catch (NullPointerException e) {
    } catch (Exception e) {
        e.printStackTrace();
    }
    gradeColumn.setCellEditor(new DefaultCellEditor(comboBox));
}
于 2011-11-22T05:07:01.540 回答
2

您需要覆盖:

Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)

...在 TableCellEditor 中。传递给此方法的值就是您可以放入 JComboBox 的值。这意味着该特定单元格的“价值”需要是可以翻译成集合的东西。它可能只是一个对象列表,也可能是一个 POJO,其中包含可以制成 JComboBox 的字段。

因此,只需编辑 MyComboBoxEditor 以覆盖该方法并更改您的模型以允许实际代表几个其他对象的对象。

于 2009-01-19T13:45:45.880 回答
2

JComboBox 内容对于每一行选择都是相同的,因为 JTable 不提供每列拥有多个编辑器的功能。您必须扩展 JTable 类以支持额外的行选择。

这篇文章解释的很好: http ://www.javaworld.com/javaworld/javatips/jw-javatip102.html

于 2011-11-24T21:39:17.217 回答
2

除了 cellEditor 之外,还需要使用 cellRenderer 来绘制单元格中的组合框,看看这个:

 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;
        }
    }
于 2013-05-24T15:47:59.993 回答
1
@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);
}

然后,覆盖toString.JComboBox

于 2010-04-19T20:35:03.343 回答
0

此页面可能会对您有所帮助,尽管您似乎仅限于在列中的所有单元格中使用相同的组合框。

于 2009-01-19T13:17:56.013 回答
0

您需要创建 JTable 的子类来覆盖 TableCellEditor getCellEditor(int row, int column) 方法。

这使您可以为任何行和列组合设置任意单元格编辑器。默认方式是为整列设置单元格编辑器。

(您还可以通过覆盖 getCellRenderer 来设置单个单元格渲染器。)

于 2009-03-20T01:55:19.263 回答
-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);
    }

}

将此加载到您的 JTable 中。如果您没有替换布尔值的默认单元格渲染器,由于您实现了 getColumnClass(),所有单元格都将被渲染为复选框。使用我们的 setValueAt() 收集这些复选框的所有用户输入。

于 2009-01-19T16:47:59.053 回答