JComboBox mit AutoVervollständigung

macsx

Mitglied
Sers!

Ich möchte mir gerne eine JComboBox mit AutoVervollständigung bauen!

Mein erster Ansatz war die Idee ein JTextField einzusetzen, bei dessen Model einen DocumentListener zu registrieren, der mir dann bei jeder Bewegung im JTextField bescheid gibt. Bei einer Reaktion des Listeners wollte ich den bis dato eingegeben Text einlesen und mit dem Array vergleichen, dass ich sowieso für die JComboBox schon habe. Dann wollte ich die JComboBox einrichten mit allen Übereinstimmungen aus der Eingabe und dem Array.


Zur Veranschaulichung:

Im Array gibt es die Einträge: "Arbeit, arbeiten, Pause, pausieren"
Man gibt ins JTextField ein: "Arb"
Dann werden "Arbeit" und "arbeiten" in der JComboBox zur Möglichkeit gestellt.


Leider musste ich verwerfen, da zwar damit die eine Fähigkeit geschaffen hatte aber zugleich damit auch die Möglichkeit nehmen musste, ohne Eingabe aus der JComboBox auszuwählen!


Ich habe mir als Alternative auch überlegt nicht nur die Übereinstimmungen auszuwählen sondern alles anzugeben, was alphabetisch nach dem Text in der Eingabe kommt, auszuwählen.

Etwa so:
http://developers.sun.com/jscreator/learning/tutorials/2/textcompletion/deployed-java-list.gif


Vielleicht hat jemand von euch einen Ansatz für mich!
Wäre echt dankbar!!


Gruß macsx
 
Hallo zusammen,
also ich finde es besser wenn in einer JComboBox laut Eingabe nicht nur vom Anfang des Strings der sich in der Combobox befindet, gesucht wird, sondern auch wenn dieser "getippte" String innerhalb des Strings vorkommt.
Ich empfehle hierzu das Paket commons-lang-2.4 von The Apache Commons Project: http://commons.apache.org/lang/
Dazu mal diese JComboBox:

Java:
package de.tutorials;
import javax.swing.*;
import java.awt.event.*;
import org.apache.commons.lang.*;

/**
 * @author jal1976
 */
public class JComboBoxCustomize extends JComboBox implements KeyListener
{
	private JTextField jtf_searchField;
	
	public JComboBoxCustomize()
	{
		this.setEditable(true);
		this.jtf_searchField = (JTextField)this.getEditor().getEditorComponent();
		this.jtf_searchField.addKeyListener(this);
	}

	public void keyReleased(final KeyEvent ke)
	{
		
	}

	public void keyPressed(final KeyEvent ke)
	{
		if(!this.isPopupVisible())
		{
			this.setPopupVisible(true);
		}
	}

	public void keyTyped(final KeyEvent ke)
	{
		char source = ke.getKeyChar();
		String search = null;
		if(source == KeyEvent.VK_ENTER)
		{
			ComboBoxModel cbm = this.getModel();
			if(!this.jtf_searchField.getText().equalsIgnoreCase(""))
			{
				search = this.jtf_searchField.getText();
				int index = this.findString(search);
				if(index != -1)
				{
					this.jtf_searchField.setText(cbm.getElementAt(index)
																.toString());
				}
			}
		}	
		if(source == KeyEvent.VK_BACK_SPACE || source == KeyEvent.VK_DELETE)
		{
			if(this.jtf_searchField.getText().length() > 0 || 
							!this.jtf_searchField.getText().equalsIgnoreCase(""))
			{
				search = this.jtf_searchField.getText();
				this.findAndSel(search, ke);
			}
			else
			{
				this.resetInput();
				ke.consume();
				return;
			}
		}
		else
		{
			if(source != KeyEvent.VK_ENTER)
			{
				search = this.jtf_searchField.getText();
				search += source;
				this.findAndSel(search, ke);
			}
		}
	}  
  
	private void findAndSel(String search, KeyEvent ke)
	{     
		int index = this.findString(search);
		this.setSelectedIndex(index);
		this.jtf_searchField.setText(search);
		this.jtf_searchField.setSelectionEnd(search.length());
		this.jtf_searchField.setSelectionStart(search.charAt(0));      
		ke.consume();
	}
  
	private int findString(String search)
	{
		ComboBoxModel cbm = this.getModel();
		for(int i=0; i<cbm.getSize(); i++)
		{
			String source = cbm.getElementAt(i).toString();
			if(StringUtils.containsIgnoreCase(source, search))
			{
				return i;
			}
		}
		return -1;
	}
  
	private void resetInput()
	{
		this.jtf_searchField.setText("");
		this.jtf_searchField.setCaretPosition(0);
		this.setSelectedIndex(-1);        
	}
}

Nach jedem neuen eingegebenem character wird die Suche begonnen, bzw. nach backspace eines characters...
viel spass und grüssle... ;-)

EDIT: hab nochmal eine verbesserte Version eingestellt, jetzt wird auch die "Enter" Taste berücksichtigt, so das der selektierte Wert übernommen wird bei Betätigen der Enter Taste... ;-)
 
Zuletzt bearbeitet von einem Moderator:
Zurück