Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Débutant][JFormattedTextField] Tread séparé pour selectAll

1 réponse
Avatar
Luchet Roger
Bonjour
toujours dans l'étude de la page
http://java.sun.com/docs/books/tutorial/uiswing/components/formattedtextfield.html
et en particulier du programme
http://java.sun.com/docs/books/tutorial/uiswing/components/examples/TextInputDemo.java
je trouve une partie du code suivant

/**
* Called when one of the fields gets the focus so that
* we can select the focused field.
*/
public void focusGained(FocusEvent e) {
Component c = e.getComponent();
if (c instanceof JFormattedTextField) {
selectItLater(c);
} else if (c instanceof JTextField) {
((JTextField)c).selectAll();
}
}

//Workaround for formatted text field focus side effects.
protected void selectItLater(Component c) {
if (c instanceof JFormattedTextField) {
final JFormattedTextField ftf = (JFormattedTextField)c;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ftf.selectAll();
}
});
}
}

Sur chaque composant il a été enrigistré un addFocusListener(this) donc
lorsque l'un de ces composants reçoit le focus la méthode
focusGained(FocusEvent e) est appelée pour permettre de sélecter (mettre en
surbrillance ) le texte que contient ce composant

Ma question: Pourqoi avoir un tread séparé ( dans la méthode
selectItLater(Component c) pour faire cette instruction lorsqu'il s'agit
d'un JFormattedTextField
C'est juste pour comprendre le pourqoi de la chose
Merci

1 réponse

Avatar
Syrion
La réponse (quoique vague) est dans le commentaire :
//Workaround for formatted text field focus side effects.

1) ce n'est pas un thread séparé qui va exécuter la méthode, mais le
même thread qui appelle les méthode de TOUS les listener. le "new
Runnable()" ne crée par un thread mais crée l'instance de Runnable dont
la méthode run() va être exécutée par un thread. ICI, c'est le thread
qui exécute les events qui va exécuter le Runnable. Sauf que comme on
appelle "invokeLater", ça sera après la fin de la méthode
"selectItLater" (le Runnable est mis en file d'attente et sera exécuté
après)
2) Souvent, lorsqu'un listener touche à la source de l'event, ci cette
source est un composant GUI, il vaut mieux que cette interaction se
fasse APRES la fin de l'event. En effet, Swing n'est pas synchronisé
pour des raisons de performances et de complexité. Dans ce cas précis,
alors qu'un JTtextField n'est pas sujet à problème, l'usine à gaz qu'est
le JFormatedTexteField peut nécessiter qu'on interragisse avec lui après
la fin de l'event.

Bonjour
toujours dans l'étude de la page
http://java.sun.com/docs/books/tutorial/uiswing/components/formattedtextfield.html
et en particulier du programme
http://java.sun.com/docs/books/tutorial/uiswing/components/examples/TextInputDemo.java
je trouve une partie du code suivant

/**
* Called when one of the fields gets the focus so that
* we can select the focused field.
*/
public void focusGained(FocusEvent e) {
Component c = e.getComponent();
if (c instanceof JFormattedTextField) {
selectItLater(c);
} else if (c instanceof JTextField) {
((JTextField)c).selectAll();
}
}

//Workaround for formatted text field focus side effects.
protected void selectItLater(Component c) {
if (c instanceof JFormattedTextField) {
final JFormattedTextField ftf = (JFormattedTextField)c;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ftf.selectAll();
}
});
}
}

Sur chaque composant il a été enrigistré un addFocusListener(this) donc
lorsque l'un de ces composants reçoit le focus la méthode
focusGained(FocusEvent e) est appelée pour permettre de sélecter (mettre en
surbrillance ) le texte que contient ce composant

Ma question: Pourqoi avoir un tread séparé ( dans la méthode
selectItLater(Component c) pour faire cette instruction lorsqu'il s'agit
d'un JFormattedTextField
C'est juste pour comprendre le pourqoi de la chose
Merci