package net.filebot.util.ui; import javax.swing.JList; import javax.swing.ListModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; public class PrototypeCellValueUpdater<T> implements ListDataListener { private int longestItemLength = -1; private JList<T> list; private T defaultValue; public PrototypeCellValueUpdater(JList<T> list, T defaultValue) { this.list = list; this.defaultValue = defaultValue; } @Override public void intervalRemoved(ListDataEvent evt) { // reset prototype value ListModel<T> m = (ListModel<T>) evt.getSource(); if (m.getSize() == 0) { longestItemLength = -1; list.setPrototypeCellValue(null); } } @Override public void intervalAdded(ListDataEvent evt) { contentsChanged(evt); } @Override public void contentsChanged(ListDataEvent evt) { ListModel<T> m = (ListModel<T>) evt.getSource(); for (int i = evt.getIndex0(); i <= evt.getIndex1() && i < m.getSize(); i++) { T item = m.getElementAt(i); int itemLength = item.toString().length(); if (itemLength > longestItemLength) { // cell values will not be updated if the prototype object remains the same (even if the object has changed) so we need to reset it if (item == list.getPrototypeCellValue()) { list.setPrototypeCellValue(defaultValue); } longestItemLength = itemLength; list.setPrototypeCellValue(item); } } } }