# SWT- TableEditor



## Guest (7. Dez 2005)

Hallo
ich habe einen Table, der in einigen Zellen Buttone mit SWT.CHECK Style hat. Alle dieser Buttone haben SelectionListeners. 
Das Problem ist, dass ich nicht hinkriegen kann, in welcher Zeile der Button liegt, der gerade eine Event ausgelöst hat.
Ich möchte also nur den Index des TableItems herausfinden, das den Button enthält.


----------



## Mag1c (7. Dez 2005)

Hi,

wenn du nirgends eine Liste der TableItems hast, wo du den Index raussuchen könntest ...

... könntest du am TableItem per setData den Index als Attribut hinzufügen, oder wie ?

Gruß
Mag1c


----------



## Guest (7. Dez 2005)

Hallo,

Ich habe keine Liste der TableItems, die einen Button enthalten.  


			
				Mag1c hat gesagt.:
			
		

> ... könntest du am TableItem per setData den Index als Attribut hinzufügen, oder wie ?
> Mag1c


Ich möchte im Listenercode das TableItem rausfinden, das in irgendeiner Zelle eine Button enthalt, der
diese Event auslöst. Dann kann ich doch siene Index finden, ohne den Index per setData hinzufügen. 
Im moment bestimme ich die Bounds des Buttons,  dann vergleiche sie mit den Bounds aller TableItems. 
Das ist aber sehr aufwendig. Gibt es keine Methode, mit der man rausfinden kann, zu welchem TableItem ein Button gehört?


----------



## tini (7. Dez 2005)

Es gibt doch die Methode getSource() vom Event.
Die liefert dir doch die Komponente, die den Event ausgelöst hat, oder versteh ich deine Frage falsch?


----------



## Guest (7. Dez 2005)

Sorry Mag1c,
ich habe jetzt verstanden was du meinst.
Danke


----------



## Guest (7. Dez 2005)

tini hat gesagt.:
			
		

> Es gibt doch die Methode getSource() vom Event.
> Die liefert dir doch die Komponente, die den Event ausgelöst hat, oder versteh ich deine Frage falsch?



Hi tini,

die Komponente erfrage ich mit

```
Button button = (Button) event.widget;
```
mein Problem war die TableItems rauszufinden, die diese Komponente enthalten.


----------



## Mag1c (7. Dez 2005)

Achso,

du brauchst erst noch das TableItem 

Ich hab mit SWT noch nicht so viel gemacht. Wie du da das TableItem ermittelst, weiß ich auch im Moment nicht. Schonmal diverse SWT-Beispiele gecheckt ?

Gruß
Mag1c


----------



## Guest (7. Dez 2005)

Hallo

ich habe mir fast alle  mit Eclipse mitgelieferte Beispiele und die Snippets auf der folgenden Seiten angeschaut.
http://www.eclipse.org/swt/snippets/
http://www.java2s.com/ExampleCode/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm
Sie bieten einen guten Überblick. Mir fehlt es aber an Programmiererfahrungen


----------



## Mag1c (8. Dez 2005)

Moin,

na dann haben wir ja was gemeinsam 

wenn du eine Lösung gefunden hast, bitte posten.

Gruß
Mag1c


----------



## Guest (8. Dez 2005)

Hallo
ich habe nun ein anderes Problem:
Egal wieviele TeableItems mit niedrigem Index gelöscht werden, bleiben die Controls, die mit TableEditor erstellt wurden, da wo sie am Anfang platziert wurden. Ich habe den code soweit wie möglich vereinfacht, um mein problem beschreiben zu können.
wenn man hier eine TableItem löscht, dann werden die Texts aktualisiert aber die Buttons nicht.

```
public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display, SWT.DIALOG_TRIM);
		shell.setBounds(100,100,500,400);
		final Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
		table.setBounds(100,100, 300, 200);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		TableColumn column1 = new TableColumn(table, SWT.NONE);
		column1.setWidth(100);
		column1.setResizable(false);
		column1.setText("Item");
		
		TableColumn column2 = new TableColumn(table, SWT.NONE);
		column2.setWidth(100);
		column2.setResizable(false);
		column2.setText("Controls");
		
		Listener buttonListener = new Listener() {
			public void handleEvent(Event event) {
				final Button button = (Button) event.widget;
				if(button == null) {
					return;
				}
				Rectangle buttonBounds = button.getBounds();
				Rectangle clientArea = table.getClientArea();
		        Point point =	new Point(  buttonBounds.x , buttonBounds.y );
		        int index = table.getTopIndex();
		        while (index < table.getItemCount()) {
		        	TableItem item = table.getItem(index);
		        	Rectangle cellArea =  item.getBounds(0);
		        	if(! cellArea.intersects(clientArea)){
		        		return;
		        	}
		        	if(cellArea.contains(point)){
		        		System.out.println("Item "+ index + " is selected");
		        		return;
		        	}
		        	index++;
		        }
			}
	    };

		for(int i=0; i<10; i++){
			TableItem tableItem = new TableItem(table, SWT.NONE );
			if ((i%2) == 0){
				tableItem.setText(0,"Item " + Integer.toString(i));
				tableItem.setText(1,"Text " );
			} else {
				tableItem.setText(0,"Text " + Integer.toString(i));
				TableEditor editor = new TableEditor(table);
				tableItem.setData(editor);
				Button button = new Button(table, SWT.CHECK);
				button.setText("Button");
				button.setSelection(false);
				button.pack();
				editor.minimumWidth = table.getColumn(0).getWidth();
				editor.horizontalAlignment = SWT.LEFT;
				editor.setEditor(button, tableItem, 1);
				button.addListener(SWT.Selection, buttonListener);
			}
		}
		
		Button deleteButton = new Button(shell, SWT.PUSH);
		deleteButton.setBounds(420, 100, 60, 20);
		deleteButton.setText("Delete");
		deleteButton.addSelectionListener(new SelectionAdapter(){
			public void widgetSelected(SelectionEvent se){
				int index = table.getSelectionIndex();
				if(index == -1) return;
				TableItem item = table.getItem(index);
				TableEditor editor = (TableEditor) item.getData();
				if(editor != null){
					Button button = (Button) editor.getEditor();
					if(button != null){
						button.dispose();
					}
					editor.dispose();
				}
				table.remove(index);
			}
		});
		
		shell.open();
	    while (!shell.isDisposed()) {
	      if (!display.readAndDispatch())
	        display.sleep();
	    }
	    display.dispose();
	}
}
```

Meine Frage ist: wie kann ich diese controls aus der Tabelle entfernen?


----------

