SWT- TableEditor

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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

Top Contributor
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
 
G

Guest

Gast
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

Bekanntes Mitglied
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?
 
G

Guest

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

Guest

Gast
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
Code:
Button button = (Button) event.widget;
mein Problem war die TableItems rauszufinden, die diese Komponente enthalten.
 

Mag1c

Top Contributor
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
 

Mag1c

Top Contributor
Moin,

na dann haben wir ja was gemeinsam ;)

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

Gruß
Mag1c
 
G

Guest

Gast
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.
Code:
	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?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben