Die einfachste Lösung ist eigentlich, die Daten vor dem Einfügen in die Combobox zu sortieren. Wenn du also eine Combobox erzeugst und ein Array übergibst, kannst du das vorher mit Arrays.sort(array) sortieren und hast kein Problem.
Wenn später noch Sachen hinzugefügt werden können, brauchst du ein ComboBoxModel, das die Sortierung übernimmt. Eine einfache Version sieht z.B. so aus:
Code:
package gui;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
public class SortedComboBoxModel extends DefaultComboBoxModel {
public SortedComboBoxModel() {
super();
}
/**
* ersetzt den entsprechenden Konstruktor der Superklasse. Das
* übergebene Array wird erst sortiert und anschließend mit der
* addItem-Methode der Superklasse eingebaut. Ich vertraue dabei
* darauf, dass der Arrays.sort-Algorhythmus schneller ist als
* die selbstgestrickte addItem-Methode dieser Klasse.
* @param itemArray
*/
public SortedComboBoxModel(final Object[] itemArray){
super();
Arrays.sort(itemArray);
for (int i = 0; i < itemArray.length; i++){
super.addElement(itemArray[i]);
}
}
/**
* Ersetzt den Konstruktor der Superklasse. Hier wird für die Sortierung
* auf den eigenen Einfügemechanismus vertraut.
*/
public SortedComboBoxModel(Vector itemVector){
super();
Iterator it = itemVector.iterator();
while (it.hasNext()){
this.addElement(it.next());
}
}
/**
* Die addElement-Methode durchläuft die vorhandenen Elemente und
* sucht nach der geeigneten Position zum Einfügen.
*/
public void addElement(Object o){
System.out.println("hinzufügen");
int min = 0;
int max = this.getSize() - 1;
int insertAt = -1;
int compare = -2;
while (min <= max){
System.out.println("compare:" + compare);
Object inList = this.getElementAt(min);
compare = ((Comparable)inList).compareTo(o);
if (compare > 0){
insertAt = min;
break;
}
min++;
}
if (insertAt == -1)
super.addElement(o);
else
super.insertElementAt(o, insertAt);
System.out.println("Einfügen bei " + insertAt);
this.setSelectedItem(o);
}
}
Du kannst es benutzen, indem du einfach sagst
Code:
JComboBox cbo = new JComboBox();
cbo.setModel(new SortetComboBoxModel());
Wenn du dann Items hinzufügst, werden die passend einsortiert.
"Passend" ist hier das Stichwort: Eingefügt werden Objekte. Die _müssen_ das Interface Comparable implementieren. Wenn du Strings einfügst, hast du kein Problem, denn die können verglichen werden. Wenn du eigene Objekte einfügen willst, musst du den kleiner-oder-größer-Vergleich selbst machen.
Wenn deine Combobox zum Beispiel Schwierigkeitsgrade enthalten soll, wäre es ja blöd, wenn die Schwierigkeitsgrade nach der Bezeichnung sortiert würden. Also brauchst du einen anderen Vergleichsmaßstab (zum Beispiel den Grad als Integer) und genau das musst du in der Klasse angeben. Außerdem solltest du eine Methode toString() einbauen, mit der du bestimmst, was bei den Objekten in der ComboBox angezeigt wird.
Lesezeichen