Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Javafreunde,
wenn der Focus einer JComboBox per TAB verlassen wird, dann möchte ich eine
Aktion ausführen.
Also habe ich an die JComboBox einen FocusListener gebunden.
Leider funktioniert das nicht. Die beiden Methoden des Listeners werden
nie aktiviert.
Gegoogelt habe ich ein CodeBeispiel mit einem FormattedTextField, dass genau so
funktioniert wie ich es möchte, aber eben mit einem TextField und nicht mit ComboBox.
Meinen Code im Ausschnitt:
combo = new MyComboBox();
combo.addFocusListener( new FocusListener() {
Das sollte eigentlich funktionieren. Wie stellst du das Problem denn fest? Ist überhaupt eine zweite Komponente vorhanden, die den Fokus bekommt, wenn du TAB drückst? Ansonsten kannst du testweise mal in ein anderes Fenster klicken, um zu sehen, ob deine Methode dann aufgerufen wird.
Hallo mihe7,
heute komme ich erst dazu, auf Deinen Post zu antworten.
Der Grund für das "Nichtfunktionieren" liegt daran, dass ich eine
editierbare ComboBox brauche.
Sobald Du die in Deinem Test verwendete ComboBox editierbar machst,
funktioniert es nicht mehr.
Keine Ahnung woran das liegt.
GBunge
das der Editor daran Schuld hat war mir klar, aber wie kann ich es dann
trotzdem erreichen, dass das Verlassen der ComboBox einen Event auslöst?
Ich möchte, dass bei Eingabe eines Zeichens in der Combo1 für eine weitere
Combo2 aus einer Datenliste die passende Zeile ermittelt wird, die mit dem
Eintrag aus Combo1 beginnt.
Nachtrag:
Im Moment löse ich ein ActionCommand aus. Das kommt aber
dummerweise bei jedem einzelnen Buchstagen in der Combo auch wenn
mich nur das komplette Wort interessiert, ich also erst dann einen
Event haben möchte, wenn ich die Combo1 verlasse. Darum die Idee
mit dem FocusEvent.
OK, jetzt klappt zumindest das Event auslösen.
Allerdings stellt sich ein neues Problem dar.
Ich habe vier ComboBoxen, die jeweils den LostEvent auslösen, wenn sie
verlassen werden.
Wie kann ich sie unterscheiden?
Ich habe es über "event.getSource()" versucht, allerdings kann ich damit
nicht auf eine Klassenvariable der ComboBox zugreifen, in der ich eine Kennzahl
stehen habe. Diese sollte mir die ComboBox identifizieren.
Gibt es eine Lösung?
Ich habe es über "event.getSource()" versucht, allerdings kann ich damit
nicht auf eine Klassenvariable der ComboBox zugreifen, in der ich eine Kennzahl
stehen habe. Diese sollte mir die ComboBox identifizieren.
Gibt es eine Lösung?
Der Rückgabetyp von "getSource()" ist "Object". Evtl. musst du entsprechend casten...
Um einen ungültigen Cast zu verhindern, solltest du vorher mit "instanceof" prüfen.
Hallo temi,
das casten habe ich als erstes in zwei Versionen versucht.
1:
@Override public void focusGained( FocusEvent e ) {
Object source = e.getSource();
for( Gb_Combo gC : combo ) { if( (Object)gC == source ) {
System.out.println( gC.num );
break;
}}}
2:
@Override public void focusGained( FocusEvent e ) {
Object source = e.getSource();
for( Gb_Combo gC : combo ) { if( gC == (Gb_Combo)source ) {
System.out.println( gC.num );
break;
}}}
beides funktioniert nicht.
Die Variable 'combo' ist ein Array vom Typ 'Gb_Combo[].
Die Variable 'num' ist eine Klassenvariable der ComboBox.
Die beiden Ansätze können so auch nicht funktionieren, weil die Quelle ja gerade nicht die jeweilige ComboBox sondern der Editor ist. Vielleicht klappt es, wenn du anstelle der Combo-Boxen über die Editoren iterierst.
Was spricht denn gegen den Vorschlag von @mihe7?
Es gibt ja grundsätzlich zwei Möglichkeiten: ein Listener für mehrere Komponenten oder je Komponente ein Listener. Möglichkeit 1 habe ich oben bereits gezeigt, Du müsstest halt JComboBox durch Gb_Combo ersetzen. Bei Möglichkeit 2 gibst Du dem Listener einfach die Komponente mit:
Java:
public class MyFocusListener implements FocusListener {
private Gb_Combo comboBox;
public MyFocusListener(Gb_Combo cb) { comboBox = cb; }
// ...
}
Registrieren musst Du den bzw. die Listener bei den betreffenden Editoren.