代码之家  ›  专栏  ›  技术社区  ›  NullPointerException

表中的JavaSWT:ReaveALL()不删除行上的按钮

  •  2
  • NullPointerException  · 技术社区  · 6 年前

    我有一张有4列的表,第四列是带有检查样式的按钮。

    问题是,每次我为用其他内容填充表而执行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 回复  |  直到 6 年前
        1
  •  1
  •   user85421    6 年前

    这个 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();
        }
    }
    

    备选方案,保存 表格编辑器 在一个列表中并处理他们的编辑器:

    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();