Problem mit JPopupMenu, JTextField und Keylistener

chris84x

Neues Mitglied
Hallo erstmal 🙂

ich hoffe ihr könnt mir bei meinem Problem weiterhelfen. Ich bastel gerade für mich so ein kleines Datenerfassungsprogramm in dem ich möchte, dass bei manchen Textfeldern so eine Auswahlliste unten erscheint. Das funktioniert an sich auch schon ganz gut nur habe ich ein Problem:

Wenn ich in meinem JTextField mit dem (unten geposteten) Listener eine Eingabe mache und dann per Tastatur "nach unten scrollen" möchte dann springt der kurz auf den ersten Eintrag und dann focusiert er wieder das TextField. Ich habe schon alles mögliche versucht mit umstrukturierung etc ... aber bin leider nicht darauf gekommen. Wäre schön wenn da jemand eine Idee/Typ für mich hätte.

Java:
public class StudentChooser implements KeyListener, ActionListener {
	
	private JTextField field;
	private JPopupMenu chooser;
	private DatabaseChooser liste;
	

	public StudentChooser (JTextField field, JPopupMenu chooser, DatabaseChooser liste) {
		this.field = field;
		this.chooser = chooser;
		this.liste = liste;
	}

	/**
	 * Sobald die Taste losgelassen wird, wird fillPopUp aufergerufen.
	 * Bei Auswahl der "Items" mit Enter wird dann das ausgewählte
	 * in das TextFeld übernommen.
	 */
	@Override
	public void keyReleased(KeyEvent arg0) {
		fillPopUp();
		chooser.setVisible(false);
		if(chooser.getComponentCount() != 0)
		{
			chooser.show(field, 0, field.getHeight());
			chooser.setVisible(true);
			
			if(arg0.getKeyCode() != KeyEvent.VK_DOWN) {				
				field.requestFocus();
			}
			
			if(arg0.getKeyCode() == KeyEvent.VK_ESCAPE) {				
				field.requestFocus();
				chooser.setVisible(false);
			}
		}
		if(arg0.getKeyCode() == KeyEvent.VK_ENTER) {
			chooser.setVisible(false);
		}
	}
	
	/**
	 * Wählt aus der Datenbank die entsprechenden Einträge für die Vorschläge.
	 */
	private void fillPopUp() {
		chooser.removeAll();
		chooser.setVisible(false);
		int counter = 1;
		
		for(int i = 0; i < liste.getSize(); i++)
		{ 
			if(liste.getEntry(i).startsWith(field.getText()) && counter <= 7)
			{
				JMenuItem mi = new JMenuItem(liste.getEntry(i));
				mi.addActionListener(this);
				chooser.add(mi);
				counter++;
			}
		}				
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
	}
	
	@Override
	public void keyTyped(KeyEvent arg0) {
	}

	@Override
	public void actionPerformed(ActionEvent arg0)
	{
		field.setText(arg0.getActionCommand());
		chooser.setVisible(false);
	}
}

und im Programm sieht das dann so aus :

juhu.png
 
Der Listener Hängt an einem JTextField. Und die Klasse hier bekommt dieses JTextField mit, sowie die Liste und das JPopup.

ouman 😛 .... ich überleg seit 2h woran das liegt ...

richtig wäre hier natürlich

Java:
if(arg0.getKeyCode() == KeyEvent.VK_DOWN) {				
				chooser.requestFocus();
			}

danke 😉

aber eine kleine Frage hätte ich noch. Wenn ich die Liste z.b. bis zum 3. Eintrag runter bin dann wieder nach oben bis zum 1. Eintrag und dann wieder in mein Eingabefeld möchte mit einem weiteren Pfeil nach oben Tastendruck ... wie könnte man denn das umsetzen?
 

Zurück
Oben