hallo zusammen
ich versuche eine ganz spezielle jcombobox zu entwickeln und zwar soll die jcombobox
beim eingeben eines buchstaben die einträge in der liste entsprechend filtern. dazu habe
ich eine lauffähige version entwickelt.
zur zeit besteht nur ein kleines problem und zwar sieht dieses wie folgt aus. wenn ich nun einen eintrag
mit der maus auswähle, wird dieser erfolgreich ins textfield geschrieben. wenn ich nun jedoch den eintrag erneut auswähle, wird der eintrag gelöscht. ich frage mich weshalb oder besser gesagt wie ich dieses problem lösen kann.
besten dank
fabio
ich versuche eine ganz spezielle jcombobox zu entwickeln und zwar soll die jcombobox
beim eingeben eines buchstaben die einträge in der liste entsprechend filtern. dazu habe
ich eine lauffähige version entwickelt.
zur zeit besteht nur ein kleines problem und zwar sieht dieses wie folgt aus. wenn ich nun einen eintrag
mit der maus auswähle, wird dieser erfolgreich ins textfield geschrieben. wenn ich nun jedoch den eintrag erneut auswähle, wird der eintrag gelöscht. ich frage mich weshalb oder besser gesagt wie ich dieses problem lösen kann.
besten dank
fabio
Code:
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
/**
* Diese Klasse repräsentiert eine modifizierte JComboBox, welche bei der Eingabe von Zeichen die Auswahlliste
* dynamisch verkleinert oder vergrössert.
*
* @author Fabio Ferrari (FFE)
* @version 1.0
*/
public class MDynamicComboBox extends JComboBox {
/**
* Dieser Vector beinhaltet alle Elemente die in die JComboBox geladen werden sollen. Der Effektive
* Datenbestand ist im DataModel vorhanden.
*/
private Vector<String> originalValues;
/**
* Enthält alle Listener die sich für den SelectedElementPerformed Event registriert haben.
*/
private MDynamicComboBoxEventMulticaster multicaster = new MDynamicComboBoxEventMulticaster();
/**
* Fügt ein MDynamicComboBoxListener der Interessentenliste hinzu.
*
* @param l Referenz auf den Listener
*/
public void addMComboBoxListener(MDynamicComboBoxListener l) {
multicaster.add(l);
}
/**
* Entfernt einen MDynamicComboBoxListener aus der Interessentenliste.
*
* @param l Referenz auf den zu löschenden Listener
*/
public void removeMComboBoxListener(MDynamicComboBoxListener l) {
multicaster.remove(l);
}
/**
* Gibt die Anzahl der registrierten Listener zurück.
*
* @return Anzahl der registrierten Listener
*/
public int getMDynamicComboBoxListenerCount(){
return multicaster.getSize();
}
/**
* Default-Konstruktor der Klasse.
*
* @param model Als Parameter wird das Dynamische ComboBoxModel benötigt
*/
public MDynamicComboBox(MDynamicComboBoxModel model) {
super(model);
originalValues = (Vector<String>) model.getElements().clone();
JTextField tf = (JTextField) getEditor().getEditorComponent();
tf.setDocument(new MDynamicComboBoxDocument());
getEditor().addActionListener(new MDynamicSelectTextActionListener());
}
/**
* Diese Klasse enthält alle Listener die informiert werden wollen, wann ein Element in der ComboBox ausgewählt wurde.
*
* @author Fabio Ferrari (FFE)
* @version 1.0
*/
private class MDynamicComboBoxEventMulticaster implements MDynamicComboBoxListener {
/**
* Enthält alle Listener die sich für den SelectedElementPerformed Event registriert haben.
*/
private Vector listener = new Vector();
/**
* Informiert alle registrierten Listener darüber, dass ein Element ausgewählt wurde.
*
* @param evt Referenz auf den entsprechenden Event
*/
public void selectedElementPerformed(MDynamicComboBoxEvent evt) {
for (int i = 0; i < listener.size(); i++) {
((MDynamicComboBoxListener) listener.elementAt(i)).selectedElementPerformed(evt);
}
}
/* 1 eingefügt wurde (z.b. bei einem Mausklick im PopupMenu) und dieser String eine
* gültige Methode darstellt, dann sollen alle Listener darüber informiert werden.
*/
if (originalValues.contains(str)) {
multicaster.selectedElementPerformed(new MDynamicComboBoxEvent(this, str));
// hidePopup();
}
}
/**
* Entfernt ein Zeichen aus dem Eingabefeld
*
* @param offset Position im Eingabefeld
* @param len Anzahl der Zeichen
* @throws BadLocationException Falls ein Fehler beim Löschen auftaucht.
*/
public void remove(int offset, int len) throws BadLocationException {
super.remove(offset, len);
System.out.println(offset + ": " + len);
refresh();
}
/**
* Diese Methode aktualisiert die Einträge im Popup werden. Es werden entweder Elemente entfernt oder neu
* hinzugefügt.
*/
public void refresh() {
JTextField tf = (JTextField) getEditor().getEditorComponent();
String text = tf.getText();
MDynamicComboBoxModel originalModel = (MDynamicComboBoxModel) getModel();
originalModel.removeAllElements();
for (int i = 0; i < originalValues.size(); i++) {
if (originalValues.get(i).startsWith(text) || text.isEmpty()) {
originalModel.addElement(originalValues.get(i));
}
}
/* objects;
private Object selectedObject = null;
public MDynamicComboBoxModel(Vector<String> v) {
objects = v;
}
public void setSelectedItem(Object anObject) {
if ((selectedObject != null && !selectedObject.equals(anObject)) || selectedObject == null && anObject != null) {
selectedObject = anObject;
}
}
public Object getSelectedItem() {
return selectedObject;
}
public int getSize() {
return objects.size();
}
public Object getElementAt(int index) {
if (index >= 0 && index < objects.size()) {
return objects.elementAt(index);
} else {
return null;
}
}
public int getIndexOf(Object anObject) {
return objects.indexOf(anObject);
}
public Vector<String> getElements() {
return objects;
}
public void addElement(Object obj) {
objects.addElement(obj.toString());
}
public void insertElementAt(Object obj, int index) {
}
public void removeElementAt(int index) {
if ((index = 0)) {
if (getElementAt(index) == selectedObject) {
if (index == 0) {
setSelectedItem(getSize() == 1 ? null : getElementAt(index + 1));
} else {
setSelectedItem(getElementAt(index - 1));
}
}
objects.removeElementAt(index);
}
}
public void removeElement(Object anObject) {
int index = objects.indexOf(anObject);
if (index != -1) {
removeElementAt(index);
}
}
public void removeAllElements() {
if (objects.size() > 0) {
objects.removeAllElements();
}
selectedObject = null;
}
public boolean contains(String str){
return objects.contains(str);
}
}
##########################
import java.util.EventListener;
/**
* Dieser Listener wird aufgerufen, wenn Elemente in der ComboBox ausgewählt wurden.
* Dieser Listener hat grosse Parallelen mit dem ItemListener, doch werden bei diesem Listener keine überflüssigen
* Events weitergegeben.
*
* @author Fabio Ferrari (FFE)
* @version 1.0
*/
public interface MDynamicComboBoxListener extends EventListener {
/**
* Callback Methode wird aufgerufen, sobald ein Element selektiert wurde.
*
* @param evt Referenz auf den Event und das Element
*/
public void selectedElementPerformed(MDynamicComboBoxEvent evt);
}
#######################
import java.util.EventObject;
/**
* Diese Klasse repräsentiert einen Event der verteilt wird, wenn ein Element bei der ComboBox ausgewählt wurde.
*
* @author Fabio Ferrari (FFE)
* @version 1.0
*/
public class MDynamicComboBoxEvent extends EventObject {
/**
* Name des ausgewählten Elements
*/
private String selectedElement;
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public MDynamicComboBoxEvent(Object source, String selectedElement) {
super(source);
this.selectedElement = selectedElement;
}
/**
* Gibt das markierte Element zurück.
*
* @return selectedElement Markierte Element
*/
public String getSelectedElement(){
return selectedElement;
}
}