SWT Table Row mit Textfeld und Combo löschen

drone68

Grünschnabel
Hallo SWT-Kenner,

ich habe mal eine Anfängerfrage. Ich möchte eine Zeile aus einer SWT-Table löschen.
Allerdings verwende ich einen TableEditor, damit die Zeilen bearbeitet werden können.

Die Tabellenzeile kann ich auch entfernen (sieht man an den Checkboxen), jedoch bleiben die Textboxen und die Combo in der Anzeige. Wie macht man es richtig? Zur Vereinfachung entferne ich im Beispiel jeweils die letzte Zeile.

Wenn ich nur eine Zeile mit einem TextEditor und einem Textfeld anlege, kann ich genau diese Elemente mit dispose entfernen.

Habt Ihr irgendeine Idee? Vielen Dank schonmal.
Code:
package table.editor;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;


public class RemoveTableItemsAndEditors {
	
    private Table table = null;
    private TableEditor editor = null;
    
    private class DoDeleteRow implements SelectionListener {

        public void widgetDefaultSelected(SelectionEvent arg0) {
            // TODO Auto-generated method stub

        }

        public void widgetSelected(SelectionEvent arg0) {
        	int itemCount = table.getItemCount();
        	System.out.println(itemCount);
        	if (itemCount>0) {
        		table.remove(itemCount-1);
			}
        	//table.remove(0);
        	table.redraw();
        }

    }

    public static void main(String[] args) {
        RemoveTableItemsAndEditors start = new RemoveTableItemsAndEditors();
        start.init();
    }
    
    public void init(){
        Display display = new Display();
        Shell shell = new Shell(display);
        
        GridLayout layout = new GridLayout(2, false);
        shell.setLayout(layout);
        
        table = new Table(shell, SWT.BORDER | SWT.MULTI | SWT.CHECK);
        table.setSize(400, 600);
        
        for (int i = 0; i < 2; i++) {
            TableColumn column = new TableColumn(table, SWT.NONE);
            column.setWidth(100);
          }
        
        for (int i = 0; i < 10; i++) {
          TableItem item = new TableItem(table, SWT.NONE);
          item.setText("Item"+i);
                              
          editor = new TableEditor (table);
          
          Text text = new Text(table, SWT.NONE);
          item.setData("item"+i, text);
             
          text.setText("Mein Text");
          editor.grabHorizontal = true;
          editor.setEditor(text, item, 0);
          
          editor = new TableEditor (table);
          CCombo combo = new CCombo (table, SWT.READ_ONLY);
          combo.add("Text 1");
          combo.add("Text 2");
          combo.add("Text 3");
          editor.grabHorizontal = true;
          editor.setEditor(combo, item, 1);
          
          
        }
         
        Button b = new Button(shell, SWT.PUSH);
        b.setText("Drück mich");
        b.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1));
        
        b.addSelectionListener(new DoDeleteRow());
        
        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
          if (!display.readAndDispatch())
            display.sleep();
        }
        display.dispose();
    }
}
 
Sow wie du beim Click den Editor erzeugst, so musst du ihn auch wieder disposen (das Textfeld setVisible(false) etc.) und den Editor auf null setzen.
Z.b. wenn der Nutzer "Escape" drückt, oder wenn eine andere Zeile angeklickt wird (wenn der Editor != null ist, dann erst löschen, bevor der neue angelegt wird)
 
Zurück