Подходящая коллекция для модели JTable, используемая для выбора
Каков наилучший набор для хранения данных в модели JTable (расширяющий AbstractTableModel), если таблица содержит флажок для выбора в первом столбце и атрибуты объекта в других столбцах (поэтому логический атрибут не является частью объекта домена в строке)? Это то, что у меня есть сейчас, но я полагаю, что какая-то карта или список будет лучше?
РЕДАКТИРОВАНИЕ: Мне нужна какая-то изменчивая коллекция для хранения пары логический / Персона, из которой я могу легко получить всех Персонов с логическим значением 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 ответ
Взгляните на модель таблицы рядов. Только первая часть относится к этому вопросу. Это показывает, как создать кастом PersonTableModel
,
В примере Person
хранится в List
и в зависимости от параметра столбца соответствующий метод получения из Person
класс используется для получения данных. В вашем случае вы хотите, чтобы логическое значение было отделено от 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. Затем выполните дальнейшую настройку, чтобы добавить логический столбец в начале.