Code
DefaultListModel model = new DefaultListModel<>();
JList list = new JList(model) {
@Override public void updateUI() {
setSelectionForeground(null);
setSelectionBackground(null);
setCellRenderer(null);
super.updateUI();
setLayoutOrientation(JList.HORIZONTAL_WRAP);
setVisibleRowCount(0);
setFixedCellWidth(82);
setFixedCellHeight(64);
setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
setCellRenderer(new ListItemListCellRenderer());
getSelectionModel().setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
}
};
private Optional getPattern() {
try {
return Optional.ofNullable(field.getText())
.filter(s -> !s.isEmpty())
.map(Pattern::compile);
} catch (PatternSyntaxException ex) {
return Optional.empty();
}
}
private void filter() {
getPattern().ifPresent(pattern -> {
List selected = list.getSelectedValuesList();
model.clear();
Stream.of(defaultModel)
.filter(item -> pattern.matcher(item.title).find())
.forEach(model::addElement);
for (ListItem item : selected) {
int i = model.indexOf(item);
list.addSelectionInterval(i, i);
}
});
}
References