Java SWT: removeAll () в TABLE не удаляет мои кнопки в строках - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть таблица с 4 столбцами, а четвертый заполнен кнопками в стиле CHECK.

Проблема в том, что каждый раз, когда я выполняю removeAll () для заполнения таблицы другим содержимым, кнопкине удаляются, поэтому я вижу одинаковые кнопки с одинаковым статусом в одних и тех же строках.

Это моя таблица:

Table membersTable = new Table(clubComposite, SWT.BORDER | SWT.CHECK | SWT.FULL_SELECTION);
membersTable.setLinesVisible(true);
membersTable.setHeaderVisible(true);
membersTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

TableColumn tblclmnName = new TableColumn(membersTable, SWT.NONE);
tblclmnName.setWidth(150);
tblclmnName.setText("Nombre");

TableColumn tblclmnCommonPhoneNumber = new TableColumn(membersTable, SWT.NONE);
tblclmnCommonPhoneNumber.setWidth(120);
tblclmnCommonPhoneNumber.setText("Teléfono");

TableColumn tblclmnCommonMoney = new TableColumn(membersTable, SWT.NONE);
tblclmnCommonMoney.setWidth(150);
tblclmnCommonMoney.setText("Participación Habitual");

TableColumn tblclmnPayed = new TableColumn(membersTable, SWT.CENTER);
tblclmnPayed.setWidth(50);
tblclmnPayed.setText("Payed"); 

И вот так я заполняюВ таблице также видны кнопки:

// populate Table
for (int i=0; i<50; i++) {
    TableItem tableItem = new TableItem(membersTable, SWT.NONE);                    
    tableItem.setText(new String[] {"person "+i, "610610620", "100"});

    Button button = new Button(membersTable, SWT.CHECK);
    button.pack();
    TableEditor editor = new TableEditor(membersTable);
    editor.minimumWidth = button.getSize().x;
    editor.horizontalAlignment = SWT.CENTER;
    editor.setEditor(button, tableItem, 3);

    button.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            //how to know in which row is clicked the checkbox?
        }
    });
}

1 Ответ

0 голосов
/ 21 сентября 2018

TableEditor не является TableItem и не будет удалено removeAll (ни clearAll).

Соответствующие элементы управления могут быть расположены программно, как в:

membersTable.removeAll();
Arrays.stream(membersTable.getChildren())    // stream over all children
      .filter(Button.class::isInstance)      // only the Buttons
      .forEach(Control::dispose);            // and dispose it

или (то же, что и выше)

membersTable.removeAll();
for(Control control : membersTable.getChildren()) {
    if (control instanceof Button) {
        control.dispose();
    }
}

Альтернатива, сохраните TableEditor в списке и расположите их редакторы:

List<TableEditor> editors = new ArrayList<>();
...
membersTable.removeAll();
editors.stream()                      // stream over TableEditors
       .map(TableEditor::getEditor)   // get their Editor (a Control)
       .forEach(Control::dispose);    // dispose it
editors.clear();
...