Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Inhalt einer JComboBox sortieren

  1. #1
    Registrierter Benutzer
    Registriert seit
    25.10.2005
    Ort
    Hamminkeln
    Beiträge
    302

    Inhalt einer JComboBox sortieren

    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?
    Vereinfacht die Dinge, und ihr erleichtert euch das Leben. (Henry David Thoreau)

  2. #2
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Du brauchst dafür nur Objekte reinstellen, die das Interface comparable implementieren, (denke ich).
    Das Ziel ist das Ziel.

  3. #3
    Registrierter Benutzer
    Registriert seit
    25.10.2005
    Ort
    Hamminkeln
    Beiträge
    302
    Hhmm, ein Interface comparable implementieren... Da kann ich im Moment nicht drauf wechseln...
    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.
    Vereinfacht die Dinge, und ihr erleichtert euch das Leben. (Henry David Thoreau)

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von Jor Beitrag anzeigen
    Hhmm, ein Interface comparable implementieren... Da kann ich im Moment nicht drauf wechseln...
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    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.
    Geändert von mwanaheri (16-11-2006 um 23:03 Uhr)
    Das Ziel ist das Ziel.

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.10.2005
    Ort
    Hamminkeln
    Beiträge
    302
    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.
    Vereinfacht die Dinge, und ihr erleichtert euch das Leben. (Henry David Thoreau)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •