# Focus Gained nach Fensterwechsel



## HannsW (19. Mrz 2009)

Hallo Javainer und innnen.

ich versuche zu debuggen, und meine, daß meine Routine FocusGained auch dann angesprungen wird, wenn ich vom debugger zurück ins Applicationsfenste wechsle.
Dieser effekt ist nicht so toll. Ich habe bereits ein 
	
	
	
	





```
if ( ! FocusEvent.Istemporary){
  tu was 
}
```
eingebaut, aber das scheint auch nicht zu helfen.

Wie kann aich vermeiden, daß FocusGained NICHT angesprochen wird, wenn mein JTextfeld bereits das Aktive ist ?
TIA Hanns


----------



## Ebenius (19. Mrz 2009)

Ungetestet; mein Ansatz sähe so aus: [HIGHLIGHT=Java]@Override
public void focusGained(FocusEvent e) {
  final Component previousOwner = e.getOppositeComponent();
  final Component newOwner = e.getComponent();
  if (previousOwner != null
        && SwingUtilities.getRoot(previousOwner) == SwingUtilities
              .getRoot(newOwner)) {
    // Now we know that the focus changed inside our window
  }
}

@Override
public void focusLost(FocusEvent e) {
  final Component previousOwner = e.getComponent();
  final Component newOwner = e.getOppositeComponent();
  if (SwingUtilities.getRoot(previousOwner) == SwingUtilities
              .getRoot(newOwner)) {
    // Now we know that the focus changed inside our window
  }
}[/HIGHLIGHT]
Eigentlich dachte ich, dafür gibt's irgendwo eine Helfer-Methode in der JDK-API, hab's aber nicht gefunden.

Ebenius


----------



## Wildcard (19. Mrz 2009)

HannsW hat gesagt.:


> Wie kann aich vermeiden, daß FocusGained NICHT angesprochen wird, wenn mein JTextfeld bereits das Aktive ist ?


Der Trick ist doch gerade, das es eben nicht 'aktiv' ist wenn du in einem anderen Fenster bist. Geht es dir denn nur um den Debugger? Kannst du das nicht mit zB einem Conditional Breakpoint lösen?


----------



## HannsW (19. Mrz 2009)

Wildcard hat gesagt.:


> Der Trick ist doch gerade, das es eben nicht 'aktiv' ist wenn du in einem anderen Fenster bist. Geht es dir denn nur um den Debugger?



Ich glaube nicht, es sei denn, ich habe ien Denkfehler gemacht:
Ich möchte beim Wechsel von einem  Textfeld zu einem anderen bestimmte "Verlassen_routine" und "Eintreten_Routinen" ausführen, aber auch NUR dann.
d.h., auch wenn ich ein inaktives Fenster durch MouseClicken auf mein vorher aktives Textfeld aktiviere, sollen diese Routinen nicht ausgeführt werden

Hanns
Oder hab ich da nen Knoten in der LEitung?


----------



## Wildcard (19. Mrz 2009)

Eine Validierung vielleicht? Je nachdem was du genau erreichen möchtest ist InputVerifier, oder Document, oder DocumentListener vielleicht das richtige für dich.


----------



## Ebenius (19. Mrz 2009)

Wildcard hat gesagt.:


> Eine Validierung vielleicht? Je nachdem was du genau erreichen möchtest ist InputVerifier, oder Document, oder DocumentListener vielleicht das richtige für dich.


Dann hast Du den letzten Beitrag nicht richtig gelesen. InputVerifier wird nur bei FOCUS_LOST aber nicht bei GAINED aufgerufen. Und DocumentListeners passen hier eigentlich auch nicht.

Ebenius


----------



## HannsW (19. Mrz 2009)

Wildcard hat gesagt.:


> Eine Validierung vielleicht? Je nachdem was du genau erreichen möchtest ist InputVerifier, oder Document, oder DocumentListener vielleicht das richtige für dich.



Danke für den Denk-Anstoß:
Beim Überprüfen der Routinen stellte ich zwei Fehler fest, und konnte durch aufruf einfacherer Routinen ( = NAchdenken ) den gewünschten effekt erreichen


----------



## Ebenius (19. Mrz 2009)

Krass. Die Möglichkeit hätte ich nach HannsWs letzter Bemerkung ausgeschlossen. Wildcard, Du hast ne Kristallkugel die größer ist als meine. 

Ebenius


----------



## Wildcard (19. Mrz 2009)

Ebenius hat gesagt.:


> Dann hast Du den letzten Beitrag nicht richtig gelesen. InputVerifier wird nur bei FOCUS_LOST aber nicht bei GAINED aufgerufen. Und DocumentListeners passen hier eigentlich auch nicht.


Gelesen schon, war einfach ein Schuß ins Blaue da der Use-Case nicht angegeben wurde und dann oft nach Details für eine angedachte Lösung gefragt wird, die mit unter nicht die richtige, oder unnötig kompliziert ist.


----------



## Ebenius (19. Mrz 2009)

Wildcard hat gesagt.:


> Gelesen schon, war einfach ein Schuß ins Blaue da der Use-Case nicht angegeben wurde und dann oft nach Details für eine angedachte Lösung gefragt wird, die mit unter nicht die richtige, oder unnötig kompliziert ist.


Schon klar, bersuche ich auch oft, Du scheinst das wohl besser zu können. :toll:

Ebenius


----------



## HannsW (19. Mrz 2009)

Ebenius hat gesagt.:


> Krass. Die Möglichkeit hätte ich nach HannsWs letzter Bemerkung ausgeschlossen. Wildcard, Du hast ne Kristallkugel die größer ist als meine.
> 
> Ebenius


DAs mit der Kugel glaube ich nicht. ZU meinem Problem:
ICh hatte ( schäm ) in der FocusGained-Routine den Code für Focus-Lost und vice versa. Da ich eh mit Documenten arbeite, habe ich auf wildcards-Antwort mwinwn COde überprüft, und den Blödsinn festgestellt.

Allein: es bleibt die Frage der Beziehung zwischen FocusEvent.isTemporary() und FocusGained() und FensterWechsel.

Wann ist ein FocusEvent temporary?
Hanns

p.s. Ich bin vielleicht nicht so ganz bei der Sache, weil man mich heute "zur Beobachtung" auf Station behalten hat. Gottlob kann ich ins WLAN


----------



## Wildcard (19. Mrz 2009)

Grundsätzlich hast du das schon richtig verstanden:


> There are two levels of focus events: permanent and temporary. Permanent focus change events occur when focus is directly moved from one Component to another, such as through a call to requestFocus() or as the user uses the TAB key to traverse Components. Temporary focus change events occur when focus is temporarily lost for a Component as the indirect result of another operation, such as Window deactivation or a Scrollbar drag. In this case, the original focus state will automatically be restored once that operation is finished, or, for the case of Window deactivation, when the Window is reactivated. Both permanent and temporary focus events are delivered using the FOCUS_GAINED and FOCUS_LOST event ids; the level may be distinguished in the event using the isTemporary() method.


FocusEvent (Java Platform SE 6)


----------



## HannsW (19. Mrz 2009)

Wildcard hat gesagt.:


> Grundsätzlich hast du das schon richtig verstanden:


Danke,:applaus: dann wars doch nur mein "codeDreher".


----------



## Wildcard (19. Mrz 2009)

Ja, aber ob das im Debug Fall noch alles so funktioniert ist was anderes. Schließlich hälst du ja den UI Thread an...


----------

