Focus Gained nach Fensterwechsel

Status
Nicht offen für weitere Antworten.

HannsW

Bekanntes Mitglied
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
Code:
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
 
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
 
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?
 
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?
 
Eine Validierung vielleicht? Je nachdem was du genau erreichen möchtest ist InputVerifier, oder Document, oder DocumentListener vielleicht das richtige für dich.
 
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
 
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
 
Krass. Die Möglichkeit hätte ich nach HannsWs letzter Bemerkung ausgeschlossen. Wildcard, Du hast ne Kristallkugel die größer ist als meine. 🙂

Ebenius
 
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.
 
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
 
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
 
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)
 
Ja, aber ob das im Debug Fall noch alles so funktioniert ist was anderes. Schließlich hälst du ja den UI Thread an...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben