org.eclipse.swt.SWTException: виджет удаляется при удалении нескольких строк из таблицы - SWT - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть Table, который имеет стиль SWT.CHECK, поэтому я могу удалить отмеченные элементы. Я добавляю кнопку и SelectionAdapter, чтобы сделать работу:

    Button btnRemove = new Button(this, SWT.PUSH);
    btnRemove.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            TableItem[] items = table.getItems(); /* get all items */
            int i;

            for (i = 0;i < items.length;i++)
                if (items[i].getChecked()) /* look if it is selected */
                    table.remove(i);
        }
    });

Когда я удаляю один элемент, он работает нормально, но когда я проверяю несколько элементов, а затем нажимаю удалить, я получаю SWTException: Widget is disposed. Вот полная трассировка стека:

org.eclipse.swt.SWTException: Widget is disposed
    at org.eclipse.swt.SWT.error(SWT.java:4282)
    at org.eclipse.swt.SWT.error(SWT.java:4197)
    at org.eclipse.swt.SWT.error(SWT.java:4168)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340)
    at org.eclipse.swt.widgets.TableItem.getChecked(TableItem.java:423)
    at org.majid.swt.Main$1.widgetSelected(Main.java:132)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:240)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
    at org.majid.swt.Main.main(Main.java:24)
  1. Может ли кто-нибудь помочь с этой проблемой?
  2. Существует ли какой-либо метод, например TableItems[] getCheckedItems(), для получения только проверенных элементов вместо проверки целых элементов?

1 Ответ

4 голосов
/ 09 декабря 2011

Как только вы вызовете table.remove(i);, элементы в таблице будут другими (на один меньше), чем в вашем массиве, и на следующей итерации i-й элемент в таблице не тот, который вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...