PDA

View Full Version : [Java] FocusListener


Limmone
03-05-2010, 09:36
Ciao a tutti, stò lavorando con le librerie swt per creare un interfaccia grafica ad un programma.
Il mio problema è il seguente:
quando premo un bottone apro una nuova shell e vorrei fare in modo che quella gia esistente non sia più accessibile fino a quando non viene chiusa quella nuova.
Ho pensato di aggiungere alla nuova shell un focus listener in modo tale da ridare in automatico il focus ogni volta che lo perde però non funziona questo metodo (o sono io a non usarlo bene :D)
Questo è quello che ho fatto io:
messaggio è una shell.

FocusListener focusListener = new FocusListener() {
public void focusGained(FocusEvent e) {

}

public void focusLost(FocusEvent e) {
messaggio.setFocus();
}
};

messaggio.addFocusListener( focusListener);

Dove sbaglio??
Grazie a tutti dell'aiuto.

banryu79
03-05-2010, 10:48
Premetto che non conosco SWT (programmo in Swing).
Però, dal codice che hai postato, tu aggiungi un focus listener a 'mesaggio' che ridà il focus a 'messaggio' stesso ogni volta che 'messaggio' produce un evento di "focus lost".

Nel tuo esempio 'messaggio' cos'è? La nuova shell o la vecchia?

Limmone
03-05-2010, 11:04
messaggio è la nuova shell.
Io cercavo di ridare a messaggio il focus ogni volta che lo perdeva, cioè se l'utente cliccava sull'altra shell automaticamente messaggio doveva riprendere il focus in modo da ritornare in primo piano.
In questo modo cerco di evitare che l'utente vada a lavorare sulla vecchia shell fintantoche messaggio è ancora aperto.

Non sò se mi sono spiegato bene.

banryu79
03-05-2010, 11:51
Leggendo i javadoc di Shell si evince che la classe espone, tra gli altri, un costruttore a cui puoi passare come parametri la Shell che deve fungere da "parent" di quella che stai istanziando (nel tuo caso la shell "vecchia") e lo "style" da usare per la nuova Shell: ebbene, tramite lo "style" puoi imposatare la "modality" che desideri tra la nuova Shell e la parent Shell.
(Specifcare la modalità di una finestra sembrerebbe il modo corretto di ottenere l'effetto che desideri, quindi puoi abbandonare l'approccio col focus listener, anche perchè il metodo setFocus(), ho visto, richiede specificamente il "keybord focus", ovvero solo gli eventi genenerati da tastiera vengono rediretti al controllo che lo possiede in quel momento mentre quello che tu vuoi ottenere è quello che, credo, in un altro punto di quei javadoc viene indicato come lo "user-interface focus").

Per specificare la modality devi usare le costanti definite nella classe SWT.
Trovi tutto nei javadoc (http://help.eclipse.org/galileo/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/package-summary.html) in 5 minuti ;)

Limmone
04-05-2010, 10:34
Grazie 1000, il tuo aiuto è stato fondamentale (come sempre :D)