Сбой приложения SWT в Windows 7 - PullRequest
0 голосов
/ 06 января 2010

У меня есть Java-приложение SWT, которое работает нормально с Windows XP и Windows Vista. Но когда я запускаю его в Windows 7, возникают странные ошибки, и он вылетает.

Например, в методе, где я вызываю Table.removeAll(), я получаю java.lang.ArrayIndexOutOfBoundsException: 0. Таблица имеет стиль SWT.VIRTUAL.

Другая проблема - когда я пишу что-то в текстовом поле (есть ModifyListener, который что-то фильтрует) - после 2 символов курсор перемещается в начало (перед первым символом).

Версия SWT - 3.5, но я попробовал использовать последнюю версию с веб-сайта eclipse (3.6M3), и результат тот же.

Есть ли известные проблемы? Кто-нибудь сталкивался с этим?


Вот фрагмент кода, который не работает в 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();
  }
}

Версии SWT, которые я проверял, (как показано в тексте в оболочке):

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

Ответы [ 2 ]

1 голос
/ 07 января 2010

Я решил эту проблему после того, как задал тот же вопрос .

Вы должны либо удалить SWT.VIRTUAL, либо обновить сборку SVN SWT. Я опубликовал отчет об ошибке на странице ошибок SWT.

Редактировать: в вашем фрагменте кода есть ошибка, которая вызывает ArrayIndexOutOfBoundsException. Вы можете решить это, изменив строки, содержащие 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 голосов
/ 25 января 2010

В Windows 7 таблица обновляет видимые элементы сразу после вызова clearAll(). Так
table.clearAll();
должно быть после строки
table.setItemCount(collection.size());

...