PRB : Zone de défilement saute haut et le bas dans l’objet de classe de UIColumnViewer

SYMPTÔMES

Lorsque vous utilisez la case de défilement (curseur de défilement) pour positionner le contenu de la fenêtre pendant que vous mettez à jour un objet de classe de UIColumnViewer , le curseur peut sauter haut et le bas, qui rend difficile de voir le contenu de la fenêtre.

Résolution

Pour contourner ce problème, procédez comme suit :

  1. Dans la méthode startRefresh , commentez la ligne de code à l’aide de l’appel pour créer le thread de mise à jour. Pour plus d’informations, voir les étapes dans la section « Informations complémentaires ».
  2. Compilez et exécutez l’application.

Plus d'informations

Procédure pour reproduire le comportement

  1. Créer un nouveau programme nommé TestViewer.java. Ce programme crée une image avec une table contenant des colonnes de cinq et une centaine de lignes. Dans la mesure où les données dépassent la taille de la fenêtre frame, le programme crée une barre de défilement afin que vous pouvez placer le contenu à afficher. En outre, le programme crée un thread de minuterie pour mettre à jour le contenu des lignes toutes les trois secondes.

    Dans TestViewer.java, collez le code suivant :
    import java.awt.*;import com.ms.ui.*;public class TestViewer{   private static TestFrame tframe = null;   public static void main(String args[])   {      tframe = new TestFrame();      tframe.initialize();   }}class TestFrame extends UIFrame{   private UIList         list         = null;   private UpdateThread   updateThread = null;   private int            iColumns     = 5;   private int            iRows        = 100;   private UIColumnViewer viewer       = null;   private boolean        bToggle      = true;   public TestFrame()   {      super("UIColumnViewer Scroll Bar update test");   }   public void initialize()   {      UIColumnHeader[] hdrs = new UIColumnHeader[]      {         new UIColumnHeader("Col 1"),         new UIColumnHeader("Col 2"),         new UIColumnHeader("Col 3"),         new UIColumnHeader("Col 4"),         new UIColumnHeader("Col 5")      };      setSize(600, 400);      list = new UIList();      viewer = new UIColumnViewer(hdrs, list);      viewer.setWidths( (600/iColumns)-7 );      UIPanel panel = new UIPanel();      panel.setLayout(new UIBorderLayout());      panel.add(viewer, "center");      add(panel);      show();      refresh();      startRefresh();   }   private void startRefresh()   {      // WORKAROUND      // Comment out this line to apply workaround.      updateThread = new  UpdateThread(this);   }   public void refresh()   {       while (list.getChildCount() > 0) list.remove(0);      viewer.paint(this.getGraphics());      for (int i=0; i < iRows; i++)      {         //Each row is made up of an array of Strings.          Object[] rowObjs = new Object[iColumns];         for (int j=0; j < iColumns; j++)         {            // Just to update the rows with different            // data in alternate cycles.            if( bToggle )               rowObjs[j] = new UIText("Data" + i + j, UIText.CENTERED);            else               rowObjs[j] = new UIText("Data" + j + i, UIText.CENTERED);         }         UIRow row = new UIRow(rowObjs);         viewer.add(row);      }      if( bToggle )         bToggle = false;      else         bToggle = true;      }   public boolean handleEvent(Event e)   {      switch(e.id)      {         case Event.WINDOW_DESTROY:            System.exit(0);            return true;        default:            return super.handleEvent(e);      }   }}// This thread updates the list periodically:// class UpdateThread extends Thread.{   private TestFrame pFrame = null;   UpdateThread(TestFrame newFrame)   {      pFrame = newFrame;      start();   }   public void run()   {      for (;;)      {         pFrame.refresh();         try { sleep(3000); }         catch (InterruptedException ex) { }      }   }}
  2. À une invite de commandes, tapez la commande suivante pour compiler TestViewer.java :
    JVC TestViewer.java
  3. À une invite de commandes, tapez la commande suivante pour exécuter le fichier TestViewer.class :
    Jview TestViewer.class
  4. Utilisez le curseur de défilement pour faire défiler haut et le bas. Vous pouvez faire défiler correctement jusqu'à ce que le contenu est mis à jour (environ toutes les 3 secondes), alors le curseur de défilement saute haut et le bas dans la barre de défilement.

RÉFÉRENCES

Pour des informations sur Visual J ++ et SDK pour Java, visitez le site Web de Microsoft à l’adresse suivante :
Propriétés

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

Microsoft Software Development Kit for Application Foundation Classes 1.0, Microsoft Software Development Kit for Java 3.2

Commentaires