【问题标题】:Appropriate collection for model of JTable used for selection用于选择的 JTable 模型的适当集合
【发布时间】:2015-06-10 13:04:40
【问题描述】:

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

已编辑:我需要一些可变集合来保存一对 boolean/Person,我可以从中轻松检索所有将 boolean 设置为 true 的 Person。

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

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

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

【问题讨论】:

  • 我建议你需要两个 List 对象。一个用于布尔值,另一个用于 Person 对象。您需要自定义模型以根据列值访问任一列表。
  • @camickr 我不确定我是否理解,你能给我一个简短的例子吗?谢谢回复!

标签: java swing jtable abstracttablemodel


【解决方案1】:

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

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

然后您需要自定义所有方法以考虑额外的布尔列。例如,您可以按如下方式自定义 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 的基础知识。然后进行进一步的自定义,在开头添加一个布尔列。

【讨论】:

  • 我已经编辑了我的帖子,你能根据编辑回复我吗?最好的问候
猜你喜欢
  • 2015-03-27
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2016-04-09
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多