BOGUE : Composant TextField AWT ne se comporte pas comme prévu

SYMPTÔMES

Lorsque vous utilisez une combinaison de la Sélectionner, focusLost, focusGainedet les méthodes setText du composant champ de texte AWT, le composant ne se comporte pas comme prévu.

Résolution

Pour réduire l’occurrence de ce bogue, effectuer deux appels vers setText chaque fois que vous avez besoin pour définir le texte de l’objet TextField. Pour plus d’informations, consultez le code commenté dans la section « Informations complémentaires ».

ÉTAT

Microsoft a confirmé qu’il s’agit d’un bogue dans les produits Microsoft répertoriés au début de cet article.

Plus d'informations

Procédure pour reproduire le comportement

  1. Compilez et exécutez le code suivant :
    import java.awt.*;import java.awt.event.*;public class Class1 {   public static void main (String[] args) {      Frame frame = new Frame();      frame.setSize( 400, 50 );      TextField textfield = new TextField( "Test", 20 );      Button button = new Button("Have a Nice Day");      frame.setLayout(new BorderLayout());      FocusListener focusListener = new FocusAdapter() {         public void focusGained( FocusEvent e ) {            ((TextField)e.getComponent()).selectAll();         }         public void focusLost( FocusEvent e ) {            ((TextField)e.getComponent()).select(0,0);         }      };      WindowListener windowListener = new WindowAdapter() {         public void windowClosing( WindowEvent e ) {            ((Frame)e.getSource()).dispose();            System.exit( 0 );         }      };      ActionListener actionListener = new ActionListener() {         public void actionPerformed( ActionEvent e ) {            String s = ((TextField)e.getSource()).getText();            ((TextField)e.getSource()).setText( s  + "." );            // Workaround            // Uncomment the following line to fix this problem            //((TextField)e.getSource()).setText( s  + "." );         }      };      frame.addWindowListener(windowListener);      textfield.addFocusListener(focusListener);      textfield.addActionListener(actionListener);      frame.add("West",textfield);      frame.add("Center",button);      frame.show();   }}
  2. Appuyez sur ENTRÉE. Cela ajoute «. » pour le texte de l’objet TextField via un appel à setText.
  3. Appuyez sur la touche de tabulation. Ainsi, le bouton actif.
  4. Appuyez de nouveau sur la touche de tabulation. Ainsi, l’objet TextField le focus, même si le texte n’est pas affiché comme prévu.
  5. Appuyez de nouveau sur la touche de tabulation. Ainsi, le bouton activé, et le texte est mis en évidence.
  6. Lorsque vous appuyez sur la touche TAB à plusieurs reprises, le texte reste en surbrillance.
Propriétés

ID d'article : 223429 - Dernière mise à jour : 15 févr. 2017 - Révision : 1

Microsoft Virtual Machine for Java, Microsoft Visual J++ 6.0 Édition standard

Commentaires