JComboBox - Fragen

AvS

Erfahrenes Mitglied
Hi,

ich möchte eine JComboBox als Darstellung für eine Chronik benutzen. In der Chronik werden Dateinamen als Strings gespeichert, die dem Nutzer anzeigen sollen, welche Dokumente sie schon benutzt haben. Implementierung steht soweit, allerdings sind mir zwei Dinge sauer aufgestoßen :

1.) Kann ich der Liste einen festen "Header" geben ?
2.) Wie kann ich doppelte Einträge verhindern ?

Hoffe hier kann mir jemand Antworten darauf geben
 
Du bist doch selbst dafür verantwortlich, was du in die Combobox reintust. Wenn du doppelte Element reinpackst sind sie da auch drin. Speichere deine Dateiliste doch in einem LinkedHashSet.
 
Ich kann nicht bestimmen, welche Einträge dort reinkommen da es von Benutzer zu Benutzer unterschiedlich sein kann. Über die Speicherung in einer Set hab ich auch schon nachgedacht, da hats aber an der Implementierung gehakt.
 
Java:
JComboBox jcb = new JComboBox();

Ich weiß, dass es wohl klüger wäre das DefaultComboBoxModel zu benutzen, aber da gibt es wie gesagt Probleme weil ich ein Set und kein Object[] oder Vector benutzen möchte.
 
Äh ja... wäre schön toll gewesen zu sehen wie deine Daten in die Combobox kommen. Dass man die mit new neu erstellt weiß ich wohl...

Java:
Set<String> fileSet = new LinkedHashSet<String>(fileList);
Vector<String> comboData = new Vector<String>(fileSet);

Ist doch kein Problem, dass dann wieder in nen Vector zu packen.
 
Ich probiers nochmal :) So wird die ComboBox erzeugt, die muss anfangs leer sein. Im Laufe der Zeit sollen dann automatisch die Dateinamen der Dokumente eingefügt werden, die aufgerufen worden sind (ohne doppelte Einträge zuzulassen).
Java:
history_set = new LinkedHashSet<String>();
		history_array = history_set.toArray();
		history_model = new DefaultComboBoxModel(history_array);
		history = new JComboBox(history_model);

Die Dateinamen kommen dann so in die Box

Java:
history_model.addElement(selectedFile.getName());

Funktioniert auch, aber es werden noch doppelte Einträge zugelassen.
 
Ahso okay. Während das Programm läuft fügst du auch immer Daten hinzu.

Dann brauchst du tatsächlich ein eigenes Modell was eben ein LinkedHashSet als Datenstruktur verwendet. Ist ja auch ziemlich einfach zu implementieren.
 
Hi,

tschuldigung für die Verspätung, hatte in der Zwischenzeit an anderen Baustellen gearbeitet. Habe mich heute nochmals damit beschäftigt und auf die Schnelle einen eigenes ComboBoxModel geschrieben. Die Set-Eigennschaft, dass keine doppelten Einträge zugelassen werden ist nun gegeben, aber die Einträge werden nicht in der ComboBox angezeigt ?

Hier ist mein Model
Java:
package gui;

import java.io.Serializable;
import java.util.LinkedHashSet;

import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;


public class MyComboBoxModel extends AbstractListModel implements  Serializable, ComboBoxModel {
   
	private static final long serialVersionUID = 1L;
	LinkedHashSet<String> objects;
    Object selectedObject;

    public MyComboBoxModel() {
        objects = new LinkedHashSet<String>();
    }

   
    public MyComboBoxModel(LinkedHashSet<String> v) {
        objects = v;

        if ( getSize() > 0 ) {
            selectedObject = getElementAt( 0 );
        }
    }

   
    public void setSelectedItem(Object anObject) {
        if ((selectedObject != null && !selectedObject.equals( anObject )) ||
	    selectedObject == null && anObject != null) {
	    selectedObject = anObject;
	    fireContentsChanged(this, -1, -1);
        }
    }

    
    public Object getSelectedItem() {
        return selectedObject;
    }

    public int getSize() {
        return objects.size();
    }

    public void addElement(String anObject) {
        objects.add(anObject);
        fireIntervalAdded(this,objects.size()-1, objects.size()-1);
        if ( objects.size() == 1 && selectedObject == null && anObject != null ) {
            setSelectedItem( anObject );
        }
    }
 
    public void removeAllElements() {
        if ( objects.size() > 0 ) {
            int firstIndex = 0;
            int lastIndex = objects.size() - 1;
            objects.clear();
	    selectedObject = null;
            fireIntervalRemoved(this, firstIndex, lastIndex);
        } else {
	    selectedObject = null;
	}
    }

	
	public Object getElementAt(int arg0) {
		return null;
	}
}

Neue Einträge werden so eingefügt
Java:
historymodel.addElement(String s);
 

Neue Beiträge

Zurück