【发布时间】: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