2011-01-07 7 views
8

Ich weiß, dass ich sehen kann, ob ein bestimmtes Widget die Kontrolle in SWT hat, indem es isFocusControl() darauf verwendet. Wenn mein erwartetes Widget jedoch keinen Fokus hat, wie kann ich dann feststellen, was (dh was hat den Fokus weggenommen)?Fokus in SWT bestimmen

Ich bin in der Lage, Tastaturereignisse mit Traverse-Listener zu behandeln, aber das Ändern des Fokus mit Mausklicks scheint meine Anwendung zu mystifizieren. Ich kann nicht herausfinden, wie ich den Gegenstand finde, der den Fokus auf den vorherigen Gegenstand gelegt hat.

Ich habe auch Probleme mit der zuverlässig Fokus auf ein anderes Widget aus einem FocusLost Listener, wenn der Fokus von einem Mausereignis geändert wird.

Irgendwelche Vorschläge?

Antwort

12

Es ist:

Display.getFocusControl(); 
+0

OK, das habe ich ausprobiert. Dies scheint ein Control zurückzugeben. Wenn ich toString() verwende, um zu lesen, welches Steuerelement den Fokus hat, sagt es einfach Text {}. Kann ich mehr Details von dieser Funktion erhalten? – Zoot

+1

Welche Art von Detail? Warum rufen Sie keine der Getterfunktionen des Steuerelements auf, um mehr Details zu erhalten? – Daniel

+0

Oder verwenden Sie die getParent() - Funktion, um zu sehen, wo in der Hierarchie es passt. – Daniel

2

Wie erläutert, Display.getFocusControl() erfahren Sie, welche Kontrollfokus hat. Sie können Informationen über die setData() - Methoden mit Widgets verknüpfen. Sie können dies mit jedem Steuerelement tun, das möglicherweise den Fokus erhalten könnte, und dann sollte getData() Ihnen helfen herauszufinden, welches Steuerelement den Fokus hat.

Andernfalls können Sie einfach Zeiger auf die Steuerelemente, die Sie erstellt haben, und vergleichen Sie den Zeiger auf Ihre bekannten Steuerzeiger, nein?

1

getFocusControl gibt ein Control zurück und Ihr Element erbt von Control. Ich benutze eine Reihe von benutzerdefinierten Steuerelemente, und wenn ich bekomme, was Fokus hat, dann bestimmt ich, welche Klasse es wirklich ist, mit einer Reihe von if (Kontrolle instanceof Myclass) -Anweisungen (sonst ifs nach dem ersten) Dann einmal habe ich die echte Klasse i dann greife in diese Klasse und nenne die richtigen Getter-Methoden, die ich in meine Klasse gelegt habe.

hoffe, das hilft,

2

Da dies ein heikles ist, lassen Sie mich etwas über den zweiten Teil der Frage hinzu:

ich mit zuverlässig Einstellung Brennpunkt bin auch auf ein anderes Widget Fragen innerhalb eines FocusLost-Listeners, wenn der Fokus durch ein Mausereignis geändert wird.

Wenn Sie den Fokus mit der Maus ändern, wird das Mausereignis nach den Fokusereignissen verarbeitet. Dies kann dazu führen, dass das Mausereignis Änderungen zurücknimmt, die Sie in den Fokusereignissen anwenden.

Um beispielsweise den Inhalt eines Textfelds auszuwählen, nachdem das Textfeld durch einen Mausklick aktiviert wurde, kann die Auswahl durch einen asynchronen Aufruf verzögert werden, bis die Ereignisse ausgelöst werden.

textfield.addFocusListener(new FocusListener() {    
    @Override 
    public void focusLost(FocusEvent e) { 
    }   
    @Override 
    public void focusGained(FocusEvent e) { 
    Display.getCurrent().asyncExec(new Runnable() { 
     @Override 
     public void run() { 
     if (!textfield.isDisposed()) { 
      textfield.selectAll(); 
     } 
     } 
    }); 
    } 
}); 

Ohne den asynchronen Aufruf widerruft das Mausereignis die Auswahl im Fokusereignis.