如果表包含第一列中的选择复选框和其他列中的对象属性,那么在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;
}
但是,我仍然想知道有更好的吗?
我打算张贴一张桌子的照片,但我不能,因为这是我的第一个问题,所以请保持温柔:)
答案 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的基础知识。然后进行进一步的自定义以在开头添加布尔列。