# JTextField Auswahlmenü



## freez (6. Sep 2005)

Hallo,

jeder kennt doch die Auswahlmenüs, die bei Textfelder aufklappen, wenn man in dem Textfeld etwas eingibt, oder doppelt rein klickt. somit sieht man seine letzten Eingaben, die man dort jemals gemacht hat. Was z.B. bei der AutoVervollständigung in vielen Browsern zu sehen. So was suche ich für Swing. Wo finde ich sowas?

Danke
Gruss
Freez


----------



## m@nu (6. Sep 2005)

hm, google mal nach "autocomplete java jtextfield" ... der findet da diverse sachen...
hab sowas bis jetzt auch noch nicht realisiert...


----------



## freez (6. Sep 2005)

habe was gesucht, aber wenig gefunden.

könnte man das nicht mit einem DropDownMenü, welches sich aufklappt bei der Eingabe realisieren?


----------



## lin (6. Sep 2005)

JComboBox

Mit der Methode

```
setEditable(true);
```

Und guck mal hier
http://www.orbital-computer.de/JComboBox/


----------



## freez (6. Sep 2005)

ja, das ist schon mal echt interessant. Ich muss mich zwar noch etwas durchwurschteln, aber das sieht gut aus.


----------



## freez (6. Sep 2005)

ein kleiner hacken ist noch dabei ... wäre ja langweilig, wenn ich nix zu tun hätte: die Einträge sind immer die selben. Da es eigentlich als Textfeld gedacht ist, sollten nur noch die passenden einträge in der ComboBox sein. Und wenn keine mehr passen, das DropDownFeld verschwinden. Eigentlich genauso, wie das Adressfeld im Browser. Genauso muss es sein. Also, es ist nicht so ganz das passende ... aber eine Welt ohne Arbeit, was wäre das denn


----------



## Sky (7. Sep 2005)

Dafür könntest Dir ein eigenes Model schreiben, welches Du der Combobox zuweisen kannst.


----------



## freez (7. Sep 2005)

Danke erst mal für eure Hilfe.

ich bin grad an folgender Lösung:
- JComboBox editierbar
- der JComboBox eine Liste MÖGLICHER Einträge mitgeben
- Tastendruck abfangen
- inhalt prüfen, und nur die Einträge im PullDown anzeigen, welche mit dem Anfang, des bereits eingegebenen Strings übereinstimmen
- wenn es keine Einträge gibt, die Übereinstimmen, PullDown schliessen

Wie hört sich das an?

Ich bin gerade dabei den Tastendruck abzufangen. Aber der KeyListener greift nicht. Funktioniert der KeyListener bei der ComboBox nicht? Wäre aber blöd, wenn man ihn setzen kann, aber nicht nutzen. Dann fehlt mir noch der Text, der eingegeben wurde. JComboBox#getText() gibt es leider net.

Gruss
freez

PS: Meine Lösung werde ich natürlich zur Verfügung stellen


----------



## freez (7. Sep 2005)

Kann mir jemand sagen, warum keine Methode vom KeyListener angesprochen wird? Ich schreibe etwas in die ComboBox rein, aber nix tut sich. Ich habe nachgeschaut, in dem Beispiel von lins Link wird der KeyListener auch bemüht, um den Tastendruck abzufangen. Was läuft verkehrt?


```
public class AutoComboBox extends JComboBox implements KeyListener
{

	private String[]	ItemList;
	PlainDocument document;

	private void initiate()
	{
		this.setEditable(true);
		document = (PlainDocument)((JTextComponent) this.getEditor().getEditorComponent()).getDocument();
		this.addKeyListener(this);
	}
	public AutoComboBox()
	{
		super();
		initiate();
	}

	public static void main(String[] args)
	{
		JFrame frame = new JFrame("ComboBoxTest");
		String [] list = {"hallo", "test", "was", "los", "denis", "berna", "kaan", "cenk", "toll"};
		AutoComboBox acb = new AutoComboBox();
		acb.setItemList(list);
		frame.getContentPane().add(acb);
		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private void setItemList(String[] list)
	{
		this.ItemList = list;
	}

	public void keyTyped(KeyEvent arg0)
	{
		System.out.println("typed " + arg0.getKeyChar());
	}

	public void keyPressed(KeyEvent arg0)
	{
		System.out.println(arg0.getKeyCode() + "Pressed");
	}

	public void keyReleased(KeyEvent arg0)
	{
		System.out.println(arg0.getKeyCode() + "Released");
	}
}
```


----------



## freez (7. Sep 2005)

OK, Problem erkannt: nicht der ComboBox den Listener hinzufügen, sondern seiner EditorComponent ... naja. Ich habe jetzt eine vorläufige Lösung. Nur habe ich noch ein kleines Problem. Sobald ich eine Taste (hier: 't') drücke, erscheint mir schon das PullDownMenü, aber meine ComboBox ergraut. Wieso?


```
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.text.JTextComponent;
import javax.swing.text.PlainDocument;
/*
 * Erstellt am 07.09.2005 16:32:53 
 *
 */

/**
 * @author oxis
 *
 */
public class AutoComboBox extends JComboBox implements KeyListener
{

	private String[]	ItemList;
	PlainDocument document;
	JTextComponent editor;
	String aktInhalt ="";

	/**
	 * @param arg0
	 */
	public AutoComboBox(ComboBoxModel arg0)
	{
		super(arg0);
		initiate();
	}

	/**
	 * 
	 */
	private void initiate()
	{
		this.setEditable(true);
		document = (PlainDocument)((JTextComponent) this.getEditor().getEditorComponent()).getDocument();
		editor = (JTextComponent)this.getEditor().getEditorComponent();
		editor.addKeyListener(this);
	}

	/**
	 * @param arg0
	 */
	public AutoComboBox(Object[] arg0)
	{
		super(arg0);
		initiate();
	}

	/**
	 * @param arg0
	 */
	public AutoComboBox(Vector arg0)
	{
		super(arg0);
		initiate();
	}

	/**
	 * 
	 */
	public AutoComboBox()
	{
		super();
		initiate();
	}

	public static void main(String[] args)
	{
		JFrame frame = new JFrame("ComboBoxTest");
		String [] list = {"hallo", "test", "was", "los", "denis", "berna", "kaan", "cenk", "toll"};
		AutoComboBox acb = new AutoComboBox();
		acb.setItemList(list);
		frame.getContentPane().add(acb);
		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	/**
	 * @param list
	 */
	private void setItemList(String[] list)
	{
		this.ItemList = list;
	}

	/* (non-Javadoc)
	 * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
	 */
	public void keyTyped(KeyEvent arg0)
	{
	}

	/* (non-Javadoc)
	 * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
	 */
	public void keyPressed(KeyEvent arg0)
	{
	}

	/* (non-Javadoc)
	 * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
	 */
	public void keyReleased(KeyEvent arg0)
	{
		this.removeAll();
		aktInhalt = editor.getText();
		System.out.println(aktInhalt);
		for(int i = 0; i < ItemList.length; i++)
		{
			if(ItemList[i].startsWith(aktInhalt))
				this.addItem(ItemList[i]);
		}				
		
		if(this.getItemCount() == 0)
			this.hidePopup();
		else
			this.showPopup();
	}
}
```


----------



## freez (19. Sep 2005)

Hallo,

ich hatte doch versprochen, eine Lösung zu präsentieren, wenn ich etwas habe. Ich bin nun folgenden Lösungsweg gegangen: Ein JTextfield mit einen JPopupMenu, welches an dem Textfield unten "dranhängt".

100%ig ist es aber noch nicht. zum Beispiel, wenn ich die Taste "Pfeil nach unten" betätige, soll der Focus im PopUp liegen. Das macht er auch. Nur springt er zum 2. Element, und dann wieder zurück ins erste. Sieht unschön aus. Aber funktioniert trotzdem. Komischerweise funktioniert es, wenn ich eine andere Methode vom KeyListener nehme. Hat aber noch andere Nachteile, wie z.B. daß das aktuelle Zeichen noch nicht im Textfeld steht, und damit funktioniert die auswertung nicht richtig.
Vielleicht sieht ja jemand auf den ersten Blick, was ich verkehrt mache. Ich habe zur Auswertung noch ein paar Printline Zeilen drin. die können natürlich gelöscht werden.


```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.text.Document;
/*
 * Erstellt am 08.09.2005 15:30:53 
 */

/**
 * @author oxis
 *
 */
public class AutoComboBox2 extends JTextField implements KeyListener, ActionListener
{

	private String[]	ItemList;
	private JPopupMenu pum = new JPopupMenu();
	private String	aktInhalt;
	private boolean popupIsShowing = false;

	public AutoComboBox2()
	{
		super();
		initiate();
	}

	public AutoComboBox2(String arg0)
	{
		super(arg0);
		initiate();
	}

	public AutoComboBox2(int arg0)
	{
		super(arg0);
		initiate();
	}

	public AutoComboBox2(String arg0, int arg1)
	{
		super(arg0, arg1);
		initiate();
	}

	public AutoComboBox2(Document arg0, String arg1, int arg2)
	{
		super(arg0, arg1, arg2);
		initiate();
	}

	private void initiate()
	{
		this.setComponentPopupMenu(pum);
		this.addKeyListener(this);
		pum.setBackground(this.getBackground());
	}

	public static void main(String[] args)
	{
		JFrame frame = new JFrame("ComboBoxTest");
		String [] list = {"hallo", "test", "was", "los", "denis", "berna", "kaan", "cenk", "toll", "he", "ho", "hi"};
		AutoComboBox2 acb = new AutoComboBox2();
		acb.setItemList(list);
		frame.getContentPane().add(acb);
		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private void setItemList(String[] list)
	{
		this.ItemList = list;		
	}

	public void keyTyped(KeyEvent arg0)
	{

	}

	public void keyPressed(KeyEvent arg0)
	{	

	}

	public void keyReleased(KeyEvent arg0)
	{
		System.out.println("key");
		fillPopUp();
		pum.setVisible(false);
		if(pum.getComponentCount() != 0)
		{
			pum.show(this, 0, this.getHeight());
			pum.setVisible(true);
			if(arg0.getKeyCode() != KeyEvent.VK_DOWN)				
				this.requestFocus();
		}
		if(arg0.getKeyCode() == KeyEvent.VK_ENTER)
			pum.setVisible(false);
	}

	private void fillPopUp()
	{
		pum.removeAll();
		pum.setVisible(false);
		aktInhalt = this.getText();
		System.out.println(aktInhalt);
		
		for(int i = 0; i < ItemList.length; i++)
		{
			if(ItemList[i].startsWith(aktInhalt))
			{
				JMenuItem mi = new JMenuItem(ItemList[i]);
				mi.addActionListener(this);
				pum.add(mi);
			}
		}				
	}

	public void actionPerformed(ActionEvent arg0)
	{
		this.setText(arg0.getActionCommand());
		pum.setVisible(false);
	}
}
```


----------



## freez (19. Sep 2005)

Axo, was mich noch etwas wundert: ich kann die Größe vom Popup nicht verändern. Es wäre schön, wenn ich eine Größe festlegen könnte, damit es immer einheitlich breit aussieht.


----------



## Jörg (20. Sep 2005)

hm die Groesse kannst du ja ganz einfach setzen mit setSize(Dimension) oder (besser) setPreferredSize(Dimension).
Leider weiss ich nicht wie sich das verhaelt, da du ja dynamischen Inhalt hast, sprich du brauchst dynamische Groesse -> neu berechnen???


----------



## freez (20. Sep 2005)

setSize habe ich versucht. aber er zeigt es mir nicht so an, wie ich es will. 
Vielleicht sollte ich mit jedem "Füllen" des Menüs die Größe nochmal neu festlegen. Vielleicht wird es automatisch überschrieben, beim Hinzufügen von Inhalt.


Ok, mal ne andere Frage. Das mit dem PopupMenue ist net soooo schön. kann man vielleicht eine JList an ein Textfield ran hängen? Ich kann ja die JList nicht so einfach per add() hinzufügen, das sie ja den Layout entsprechend positioniert wird. Kann ich sie frei schwebend über dem Frame positionieren?

Und wenn ich grad bei so vielen Fragen bin. Hat jemand eine deutsche Buchempfehlung, für das GUI von Java? Speziell für solche Fälle, wie mein Problem jetzt. Und wie man z.B. komplett neue Elemente erstellen kann. Was einfach tiefer geht, als das benutzen, der vorhandenen Elemente.


----------



## Jörg (20. Sep 2005)

> deutsche Buchempfehlung


nöö, alles was ich kenne ist Englisch!

das mit der JList weiß ich nicht, aber da kommst du ja langsam in die richtung JComboBox, vielleicht kuckst dir da mal die sourcen an ...


----------



## Jörg (24. Sep 2005)

what's up comrade? Kein Lust mehr??

Hab das ganze mal von der anderen Seite aus probiert (JComboBox)
allerdings weiss ich nicht wie sich das mit dem LaF vertraegt,
musste einige Methoden bzgl UI ueberschreiben, damit ich den
Button wegkrieg ...
Leider hab ich jetzt noch das Problem, dass sich das Textfeld von 
verschiedenen Handlern aus aendert, da war deine Loesung 
einfacher ....


----------

