2010-01-06 5 views
0

J'ai une application SWT Java qui fonctionne correctement avec Windows XP et Windows Vista. Mais quand je l'exécute sur Windows 7, des erreurs étranges se produisent, et il se bloque. Par exemple, dans une méthode où j'appelle Table.removeAll(), je reçois un java.lang.ArrayIndexOutOfBoundsException: 0. La table a le style SWT.VIRTUAL.L'application SWT tombe en panne dans Windows 7

Un autre problème est lorsque j'écris quelque chose dans une zone de texte (il y a un ModifyListener qui filtre quelque chose) - après 2 caractères, le curseur se déplace au début (avant le premier caractère).

La version SWT est 3.5, mais j'ai essayé avec la dernière version du site web eclipse (3.6M3) et le résultat est le même.

Y a-t-il des problèmes connus? Est-ce que quelqu'un a rencontré ça?


Voici un extrait qui ne fonctionne pas dans Windows 7:

import java.util.*; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.*; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 

public class TableCheck { 

    Shell shell; 

    Button button1, button2, button3; 

    UltraTable ut; 

    public TableCheck() { 
    Display display = new Display(); 
    shell = new Shell(display); 
    shell.setLayout(new GridLayout(4, false)); 
    Text text = new Text(shell, SWT.SINGLE | SWT.LEAD | SWT.READ_ONLY | SWT.BORDER); 
    text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); 
    text.setText("SWT " + SWT.getPlatform() + " " + SWT.getVersion() + "; " 
      + System.getProperty("os.name") + " " + System.getProperty("os.version") + " " 
      + System.getProperty("os.arch")); 

    SelectionAdapter listener = new SelectionAdapter() { 
     public void widgetSelected(SelectionEvent e) { 
      if (e.widget == button1) { 
       ut.setContent(Arrays.asList("01", "34", "test", "test2", "123", "1test", "test2")); 
      } else if (e.widget == button2) { 
       ut.setContent(Arrays.asList("Str1", "Str2", "Str3")); 
      } else { 
       ut.setContent(Collections.emptyList()); 
      } 
     } 
    }; 
    button1 = new Button(shell, SWT.PUSH); 
    button1.setText("Data 1"); 
    button1.addSelectionListener(listener); 
    button2 = new Button(shell, SWT.PUSH); 
    button2.setText("Data 2"); 
    button2.addSelectionListener(listener); 
    button3 = new Button(shell, SWT.PUSH); 
    button3.setText("Data 3"); 
    button3.addSelectionListener(listener); 

    GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1); 
    gd.widthHint = gd.heightHint = 320; 
    ut = new UltraTable(shell, SWT.MULTI | SWT.BORDER | SWT.VIRTUAL | SWT.FULL_SELECTION); 
    ut.table.setLayoutData(gd); 
    shell.pack(); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    display.dispose(); 
    } 

    class UltraTable { 
    private Table table; 

    private static final String DATA_COLLECTION = "<<CC>>", DATA_LISTENER = "<<VL>>"; 

    public UltraTable(Composite parent, int style) { 
     table = new Table(parent, style); 
     table.setLinesVisible(true); 
     table.setHeaderVisible(true); 
     TableColumn tableColumn = new TableColumn(table, SWT.NONE); 
     tableColumn.setText("Column"); 
     tableColumn.setWidth(64); 
    } 

    void setContent(Collection<?> collection) { 
     if ((table.getStyle() & SWT.VIRTUAL) != 0) { 
      table.setData(DATA_COLLECTION, collection); 
      table.clearAll(); 
      table.setItemCount(collection.size()); 
      if (table.getData(DATA_LISTENER) == null) { 
       Listener listenerSD = new Listener() { 
        public void handleEvent(Event event) { 
         Collection<?> collectionW = (Collection<?>) event.widget.getData(DATA_COLLECTION); 
         Object object = collectionW.toArray(new Object[collectionW.size()])[event.index]; 
         ((TableItem) event.item).setText(0, object.toString()); 
        } 
       }; 
       table.setData(DATA_LISTENER, listenerSD); 
       table.addListener(SWT.SetData, listenerSD); 
      } 
     } 
    } 
    } 
    public static void main(String[] args) { 
    new TableCheck(); 
    } 
} 

Les versions SWT I Cochez la case pour (comme indiqué dans le texte dans la coquille):

SWT win32 3550; Windows 7 6.1 x86
SWT win32 3617; Windows 7 6.1 x86

Répondre

0

Sous Windows 7, le tableau met à jour les éléments visibles immédiatement lorsque clearAll() est appelé. Alors
table.clearAll();
doit être après la ligne
table.setItemCount(collection.size());

1

J'ai résolu ce problème après asking the same question.

Vous devez supprimer SWT.VIRTUAL ou mettre à jour vers la version SVN de SWT. J'ai posté a bug report sur la page de bug de SWT.

Modifier: votre extrait de code a un bug qui provoque le ArrayIndexOutOfBoundsException. Vous pouvez le résoudre en changeant les lignes contenant listenerSD:

public void handleEvent(Event event) { 
    Collection<?> collectionW = (Collection<?>) event.widget 
      .getData(DATA_COLLECTION); 
    if (collectionW.size() > event.index) { 
     Object object = collectionW 
       .toArray(new Object[collectionW.size()])[event.index]; 
     ((TableItem) event.item).setText(0, object 
       .toString()); 
    } 
} 
+0

Merci pour la réponse. J'ai fait une recherche auparavant sur SO, mais je n'ai pas trouvé votre question, parce que dans mon cas ce n'était pas 'StackOverflowError' et vous n'avez pas ajouté la balise' windows-7' –

+0

J'ai ajouté le tag à ma question si autre les utilisateurs peuvent le trouver plus facilement. Le rapport de bogue sur l'Eclipse n'indique pas explicitement le 'StackOverflowError' (sauf où j'ai posté ma trace de pile), seulement qu'il y a des occurrences où SWT se bloque. Quels sont vos symptômes exactement? Peut-être poster un exemple de travail minimum sur le site de bogue aidera les développeurs SWT à tracer la source du problème. –

+0

Je vais faire un extrait avec ce cas, car (je pense) le correctif ne résout pas le problème. Le fait est que je n'ai pas Windows 7 et il est difficile de trouver et de tester les méthodes exactes qui causent ces problèmes. –

Questions connexes