Author: echatellier Date: 2011-12-16 16:43:35 +0100 (Fri, 16 Dec 2011) New Revision: 3565 Url: http://forge.codelutin.com/repositories/revision/isis-fish/3565 Log: Ajout d'un cache pour le modele de filtres des listes sinon les perfs sont d?\195?\169sastreuses. Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/widget/FilterableComboBox.java Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/widget/FilterableComboBox.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/widget/FilterableComboBox.java 2011-12-10 11:27:50 UTC (rev 3564) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/widget/FilterableComboBox.java 2011-12-16 15:43:35 UTC (rev 3565) @@ -69,6 +69,13 @@ protected boolean filtering = false; + /* + * Il faut obligatoirement que la liste filtrées soit mise en cache, car + * l'appeler dans le getElementAt() comme c'était fait avant dégrade énormement + * les perfs, un truc de dingue. + */ + protected List<Object> itemCache; + public FilterableComboBox() { actionListeners = new ArrayList<ActionListener>(); buildLayout(); @@ -92,35 +99,39 @@ @Override public int getSize() { - int delegateSize = model.getSize(); - int realSize = 0; - for (int i = 0; i < delegateSize; ++i) { - if (model.getElementAt(i).toString().matches(".*" + filterField.getText() + ".*")) { - realSize++; - } + int size = 0; + if (itemCache != null) { + size = itemCache.size(); + } else { + size = model.getSize(); } - return realSize; + return size; } @Override public Object getElementAt(int index) { + Object element = null; + if (itemCache != null) { + element = itemCache.get(index); + } else { + element = model.getElementAt(index); + } + return element; + } + + public void fireDataChanged() { + filtering = true; + super.fireContentsChanged(this, 0, model.getSize()); + + // filter list int delegateSize = model.getSize(); - int realIndex = -1; + itemCache = new ArrayList<Object>(delegateSize); for (int i = 0; i < delegateSize; ++i) { Object element = model.getElementAt(i); if (element.toString().matches(".*" + filterField.getText() + ".*")) { - realIndex++; + itemCache.add(element); } - if (index == realIndex) { - return element; - } } - return null; - } - - public void fireDataChanged() { - filtering = true; - super.fireContentsChanged(this, 0, model.getSize()); filtering = false; }