# DefaultListModel auf JList sortieren



## Nothiing___ (20. Aug 2010)

Hallo

Ich möchte ein DefaultListModel sortieren. Das DefaultListModel befindet sich auf einer JList und hat bereits Elemente

Wie kann ich das machen, gibt des dafür bereits vorhandene Methoden odr muss ich einen Vector schrieben oder was kann ich tun?

Liebe Grüsse und Herzlichen Danke im Voraus
Nothiing


----------



## eRaaaa (20. Aug 2010)

> "und hat bereits Elemente"

Was sind das für Elemente? Strings, eigene Objekte ?

Anbieten würde sich da wahrscheinlich ein eigenes model!


----------



## XHelp (20. Aug 2010)

Du könntest dir die Werte mit 
	
	
	
	





```
getElementAt
```
 in eine Liste packen, die sortieren und mit 
	
	
	
	





```
setElementAt
```
 wieder setzen.


----------



## Gast2 (20. Aug 2010)

```
Vector columns = // wirst du ja schon irgenwo gesetzt haben
Vector data = listModel.getDataVector();
Collections.sort(data);
listModel.setDataVector(data,columns);
//Oder aber 
listModel = new DefaultTableModell(data,columns);
```

Musst halt wie eRaaaa schon sagt gucken ob du evtl halt die Objecte so einfach sortieren kannst. Sonst halt ein comparator einsetzen.

EDIT://

Hrm - genaugenommen müsste doch auch 

```
Vector data = listModel.getDataVector();
Collections.sort(data);
```
schon reichen?


----------



## eRaaaa (20. Aug 2010)

fassy hat gesagt.:


> Hrm - genaugenommen müsste doch auch
> 
> ```
> Vector data = listModel.getDataVector();
> ...



Wenn das Default*List*Model eine Methode ala`getDataVector() anbieten würde, dann schon 
Glaube man hat da so keine Möglichkeit wie bei dem TableModel.
Ich würde zu so etwas wie

```
class SortableListModel<T extends Comparable<? super T>> extends AbstractListModel {

	private List<T> model = new ArrayList<T>();
	private boolean isSorted = true;

	public void sort() {
		if (!isSorted) {
			Collections.sort(model);
			fireContentsChanged(this, 0, model.size() - 1);
		}
	}

	private void addElement(T element) {
		addElement(element, model.size());
	}

	private void addElement(T element, int index) {
		model.add(index, element);
		fireIntervalAdded(this, index, index);
	}

	public void addElement(T element, boolean sort) {
		if (!sort) {
			addElement(element);
			isSorted = false;
		} else {
			if (!isSorted) {
				sort();
			}
			int index = Collections.binarySearch(model, element);
			if (index < 0)
				addElement(element, -index - 1);
			else
				addElement(element, index);
			isSorted = true;
		}
	}

	@Override
	public Object getElementAt(int index) {
		return model.get(index);
	}

	@Override
	public int getSize() {
		return model.size();
	}
}
```
tendieren


----------



## Gast2 (20. Aug 2010)

*doh*

Jepp - hab da die Modelle durcheinandergeworfen... *schäm*


----------



## slawaweis (20. Aug 2010)

Nothiing___ hat gesagt.:


> Ich möchte ein DefaultListModel sortieren. Das DefaultListModel befindet sich auf einer JList und hat bereits Elemente
> 
> Wie kann ich das machen, gibt des dafür bereits vorhandene Methoden odr muss ich einen Vector schrieben oder was kann ich tun?


ganz einfach geht es mit der JXList aus SwingX:


```
JXList list = ...;
list.setSortable(true);
list.setAutoCreateRowSorter(true);
list.setComparator(new Comparator() { ... });
list.setSortOrder(SortOrder.DESCENDING);
```

Wenn man die JXList nicht verwenden kann, dann wird es kompliziert.

Slawa


----------



## Marco13 (21. Aug 2010)

Ob sortiertes Einfügen (und auch noch durch eine eigene Klasse) da Sinn macht? Da die Liste vermutlich nicht gerade 10^15 Elemente enthält könnte man das da wohl ganz pragmatisch machen: Elemente rauslesen, in List packen, List sortieren, Elemente wieder einfügen. Bis 1000 Elemente ist der Rechner damit fertig während der Schall vom Klicken der Maus noch gemächlich in Richtung der Ohrs des Anwenders juckelt.


----------

