PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Inhalt einer JComboBox sortieren



Jor
15-11-2006, 12:31
Hallo alle zusammen,

bin momentan auf der Suche nach einer Lösung, wie ich schnell den Inhalt einer JCombobox sortieren kann. Kann mir jemand einen Tipp geben? :)

mwanaheri
15-11-2006, 17:07
Du brauchst dafür nur Objekte reinstellen, die das Interface comparable implementieren, (denke ich).

Jor
16-11-2006, 06:19
Hhmm, ein Interface comparable implementieren... Da kann ich im Moment nicht drauf wechseln...:confused:
Wie ich dich verstanden habe, sollen die Objekte, die ich in die ComboBox stelle, diese Eigenschaft haben, oder? Ich hatte erhofft, dass die Klasse ComboBox bzw. die ComboBox.Model diese Eigenschaft aufweisen un dich sie nicht gefunden habe.
Hast du vielleicht ein Beispielscript?
Ich das sonst über eine SortedMap (o.ä.) machen wollen, wäre das ein akzeptabler Weg? Es werden nicht viele Datensätze verwaltet, aller dings mindestens vier solcher Boxen.

anda_skoa
16-11-2006, 15:22
Hhmm, ein Interface comparable implementieren... Da kann ich im Moment nicht drauf wechseln...:confused:
Wie ich dich verstanden habe, sollen die Objekte, die ich in die ComboBox stelle, diese Eigenschaft haben, oder?

Damit die ComboBox Elemente sortieren kann, muß sie sie vergleichen können. Das kann sie nur, wenn die Elemente Comparable implementieren, weil die ComboBox sonst keinen Ansatz hat, wie sie die Elemente vergleich sollte.

Ciao,
_

mwanaheri
16-11-2006, 23:01
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:

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


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.

Jor
20-11-2006, 13:07
Hallo mwanaheri und anda_skoa,

ich habe eure Antworten soeben gelesen, vielen Dank! Ich habe die Sache mit einer SortedMap mal versucht und über den Iterator die Werte eingelesen, werde aber deinen Vorschlag, mwanaheri, auch umsetzen und mich vor allem dem "comparable" hingeben. ;)