适合用于选择的JTable模型的收集

时间:2015-06-10 13:04:40

标签: java swing jtable abstracttablemodel

如果表包含第一列中的选择复选框和其他列中的对象属性,那么在JTable模型中存储数据(扩展AbstractTableModel)的最佳集合是什么(因此布尔属性不是域的一部分)行中的对象)? 这就是我现在所拥有的,但我想一些地图或列表会更好?

EDITED:我需要一些可变集合来保存一对boolean / Person,从中我可以轻松地检索所有布尔值设置为true的人。

public class TableModelPerson extends AbstractTableModel {

    private String columnName[] = {"Yes/No", "First name", "Last name"};
    private Object data[][] = {
        {true, new Person("Katy", "Brown")},
        {false, new Person("Sam", "Brown")},
        {true, new Person("Peter", "Brown")}
    };

    @Override
    public int getRowCount() {
       return data.length;
   }

    @Override
    public int getColumnCount() {
      return columnName.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
         Person person = (Person) data[rowIndex][1];
         switch (columnIndex) {
            case 0:
               return data[rowIndex][0];
            case 1:
               return person.getFirstName();
            case 2:
               return person.getLastName();
         }
      return "error";
   }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
       data[rowIndex][columnIndex] = aValue;
       fireTableDataChanged();
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
       return getValueAt(0, columnIndex).getClass();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
      if (columnIndex == 0) {
        return true;
      }
      return false;
    }

    @Override
    public String getColumnName(int column) {
      return columnName[column];
    }

    public List<Person> getAllSelectedPersons() {
      List<Person> lista = new ArrayList<>(1);
        for (int i = 0; i < data.length; i++) {
           if (data[i][0] == true) {
            lista.add(new Person((String) data[i][1], (String) data[i][2]));
           }
        }
        return lista;
    }

    public void addPerson(Person person){
        // code for adding a person
    }

    public void removePerson(Person person){
        //code for removing person
    }

  }

编辑:我可能找到了解决方案:

    private List<Map.Entry<Boolean, Person>> boolPerson = new ArrayList<>();

    public List<Person> getPersonsSelected(){
       List<Person> personList = new ArrayList<>();
       for(Map.Entry<Boolean, Person> entry : boolPerson){
          if(entry.getKey()){
              personList.add(entry.getValue());
          }
       }
       return personList;
    }

但是,我仍然想知道有更好的吗?

我打算张贴一张桌子的照片,但我不能,因为这是我的第一个问题,所以请保持温柔:)

1 个答案:

答案 0 :(得分:1)

看看Row Table Model。只有第一部分涉及这个问题。它显示了如何创建自定义PersonTableModel

在示例中,Person存储在List中,并且根据列参数,Person类中的相应getter方法用于获取数据。在您的情况下,您希望将布尔值与Person分开,因此您还需要为所有布尔值分别存储。

然后,您需要自定义所有方法以考虑额外的布尔列。例如,您可以按如下方式自定义getColumnClass()方法:

@Override
public Class getColumnClass(int column)
{
    switch (column)
    {
        case 0: return Boolean.class; // added
        case 3: return Date.class; // changed
        default: return String.class;
    }
}

所以我建议你首先使用博客中的代码让你的代码为一个简单的Person类工作,以了解创建自定义TableModel的基础知识。然后进行进一步的自定义以在开头添加布尔列。