Из комментариев видно, что вам нужна не модель объектов Book, а модель, содержащая атрибуты класса Book.
Хорошим подходом является создание небольшого пользовательского объекта, который будет служить элементом JComboBox:
public class BookAttribute {
private final String name;
private final int columnNumber;
public BookAttribute(String name,
int columnNumber) {
this.name = Objects.requireNonNull(name, "Name cannot be null");
this.columnNumber = columnNumber;
}
public String getName() {
return name;
}
public int getColumnNumber() {
return columnNumber;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof BookAttribute) {
return this.columnNumber == ((BookAttribute) obj).columnNumber;
}
return false;
}
@Override
public int hashCode() {
return Integer.hashCode(columnNumber);
}
@Override
public String toString() {
return name;
}
}
С этим классом вам не нужна пользовательская модель. Вы можете просто передать экземпляры непосредственно в стандартный конструктор JComboBox:
TableModel model = table.getModel();
int count = model.getColumnCount();
Vector<BookAttribute> fields = new Vector<>(count);
for (int col = 0; col < count; col++) {
fields.add(new BookAttribute(model.getColumnName(col), col));
}
JComboBox<BookAttribute> fieldList = new JComboBox<>(fields);
Чтобы использовать его, добавьте фильтр в RowSorter вашего стола:
table.setAutoCreateRowSorter(true);
ActionListener filterUpdater = e -> {
String searchText = searchField.getText();
BookAttribute bookAttribute =
(BookAttribute) fieldList.getSelectedItem();
int columnNumber = bookAttribute.getColumnNumber();
TableRowSorter<? extends TableModel> sorter =
(TableRowSorter<? extends TableModel>) table.getRowSorter();
sorter.setRowFilter(new RowFilter<TableModel, Integer>() {
@Override
public boolean include(
Entry<? extends TableModel, ? extends Integer> entry) {
return entry.getStringValue(columnNumber).contains(searchText);
}
});
};
searchField.addActionListener(filterUpdater);
fieldList.addActionListener(filterUpdater);
(Вы могли бы использовать отражение для этого, но вы не должны. Отражение ненадежно и подвержено ошибкам, потому что оно не может быть проверено на корректность компилятором. Оно также не может быть оптимизировано Java время выполнения, обычно.)