combox -> keylistener -> problem

benhaze

Mitglied Platinum
ComboBox -> keylistener -> problem

Hallo!
Habe folgendes blödes Problem und komme einfach nicht weiter:

Szenario
[Java 1.5.0_06 + swing]
simples JPanel, welches eine ComboBox und ein TextField anzeigt.
Habe dem Editor der ComboBox einen KeyListener hinzugefügt.
Das TextField dient nur zum Test des darauf registrierten KeyListeners.

Problem:
-Der KeyListeners des TextField wird aufgerufen!
-Der KeyListeners der ComboBox wird "nicht" aufgerufen!

Hier der Code, der Methode, die eine ComboBox liefert:
(der Code für das TextField ist derselbe (natürlich ohne ComboBox/-Editor kram))
Code:
      JComboBox c = new JComboBox();
      Component comp = c.getEditor().getEditorComponent();
      JTextField tf = (JTextField)comp;
      tf.addKeyListener(new KeyListener()
      {
         public void keyPressed(KeyEvent e)
         {
            System.err.println("1");
         }
         public void keyReleased(KeyEvent e)
         {
            System.err.println("2");
         }
         public void keyTyped(KeyEvent e)
         {
            System.err.println("3");
         }
      });
      return c;

Welche Ursachen könnten dies verursachen ?

Bin sehr dankbar für alle Ideen !
 
Zuletzt bearbeitet:
Hallo benhaze,

schau mal hier:

Java:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.text.JTextComponent;

public class ComboWithKeyListener extends JFrame implements KeyListener {

	String[] items = { "Arial", "Verdana", "Times new Roman" };

	JTextComponent comboeditor;

	JComboBox combo = new JComboBox(items);

	public ComboWithKeyListener() {
		combo.setEditable(true);

		comboeditor = (JTextComponent) combo.getEditor().getEditorComponent();
		comboeditor.setText("");

		add(combo);

		comboeditor.addKeyListener(this);

		setLocationByPlatform(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new ComboWithKeyListener();
	}

	public void keyTyped(KeyEvent e) {
		System.out.println(e.getKeyChar());
	}

	public void keyPressed(KeyEvent e) {
		System.out.println(e.getKeyChar());
	}

	public void keyReleased(KeyEvent e) {
		System.out.println(e.getKeyChar());
	}
}


Vg Erdal
 
ja, standalone funktionierts (also dein code)

nur in meiner klasse, funktionierts nicht !

Code:
public static JComboBox getModulesAsComboBox()
{
   JComboBox c = new jComboBox(ModuleManager.getAllModuleComponents().toArray());
   JTextComponent tf = (JTextComponent)c.getEditor().getEditorComponent();
   MyKeyListener kl = new MyKeyListener();
   tf.addKeyListener(kl);
   return c;
}

MyKeyListener ist eine einfache implementation des KeyListeners.
 
ich werd bekloppt!
funktioniert!

da wär ich nie draufgekommen, da ich irgendwie wirklich dachte, hätte die property bereits gesetzt!

Super! Danke!
 
ach, zu früh gefreut

da ich folgende code ebenfalls durchlaufe:
Code:
 Toolkit.getDefaultToolkit().getSystemEventQueue().push( new EventQueue()
      {
         protected void dispatchEvent(AWTEvent event)
         {
            if (event instanceof KeyEvent)
            {
               KeyEvent keyEvent = (KeyEvent) event;
               proceedHotKey(keyEvent);
            }
            if (event instanceof MouseEvent)
            {
               MouseEvent mouseEvent = (MouseEvent) event;
               proceedMouseEvent(mouseEvent);
            }
            if (event instanceof FocusEvent)
            {
               FocusEvent focusEvent = (FocusEvent) event;
               proceedFocusEvent(focusEvent);
            }
            super.dispatchEvent(event);
         }
      });
und dort (zufälligerweise) nen breakpoint gesetzt hatte, hielt mein debugger beim drücken einer taste dort an.Fälschlicherweise dachte ich, alles sei nun Ok.

Als ich dann feststellte, das ich gar nicht an der richtigen stelle bin, merkte ich auch das es immer noch nicht funktionert.

Also, alles zurück! Fehlalarm !! Sorry...im Eifer des Gefechts!

Also ich hab das nocheinmal so getestet:
Benutze die vorherige Methode nun nur noch um das ComboModel zu holen und setzten.
Aber der KeyListener wird nach wie vor nicht aufgerufen!
Code:
         jComboBox1.setModel(ModuleHelper.getModulesAsComboBox().getModel());
         jComboBox1.setEditable(true);
         JTextComponent tf = (JTextComponent)jComboBox1.getEditor().getEditorComponent();
      KeyListener kl = new MyKeyListener();
      tf.addKeyListener(kl);
Gestehe, bin kein Guru...
 
Zuletzt bearbeitet:
Hab mir jetzt nen eigenen ComboBoxEditor gebastelt, und darauf einen KeyListener registriert.
Funktioniert wunderbar.

Code:
      jComboBox1.setModel(ModuleHelper.getModulesAsComboBox().getModel());
      jComboBox1.setEditable(true);
      ComboBoxEditorEx editor = new ComboBoxEditorEx();
      jComboBox1.setEditor(editor);
      MyKeyListener kl = new MyKeyListener();
      editor.setKeyListener(kl);

ComboBoxEditorEx ist wieder nur ne simple implementation des ComboBoxEditor
mit einem TextField als Component.
Auf dessen TextField registrier ich dann den KeyListener.
 
Zurück