SWT.check bei Tabelle

T

Tobias Köhler

Hallo

Ich habe eine Tabelle(Warenkorb) und in jeder Zeile befindet sich ein neuer Artikel. Nur die letzten 2 Zeilen sind eher als Zusammenfassung gedacht.

Mein Frage ist nun: Gibt es eine Möglichkeit, ohne TableEditor es zu ermöglichen, dass vor jeder Zeile eine Checkbox ist, nur in den unteren beiden nicht?
Denn der User darf ja nicht die Zusammenfassung aus dem Warenkorb entfernen können;-)
 
also ohne tableedito geht das meines wissens nicht! aber warum muss es unbeding ohne sein mit währe ja nicht kompliziert oder geht dann damit eine bestimmte Anforderung nicht?
 
Nein, die Anwendung würde komplett weiterhin funktionieren... soweit ich weiß. Aber ich wollte gern auf den verzichten, da mir dieser TableEditor nicht wirklich gefällt, da ich nicht direkt auf den Button zugreifen kann. Dazu kommt noch, dass ich ihn ehrlich gesagt noch nicht so recht verstanden habe:rolleyes: ;)
 
Probier mal das aus:
Java:
package table;

/*
 * Table example snippet: create a table (columns, headers, lines)
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 */
import org.eclipse.swt.SWT;
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;

public class Snippet38 {

	public static void main(String[] args) {
		Display display = new Display( );
		Shell shell = new Shell(display);
		Table table = new Table(shell, SWT.MULTI | SWT.BORDER |
				SWT.FULL_SELECTION);
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		String[] titles = {" ", "C", "!", "Description", "Resource",
				"In Folder", "Location"};
		for (int i = 0; i < titles.length; i++) {
			TableColumn column = new TableColumn(table, SWT.NONE);
			column.setText(titles[i]);
		}
		int count = 10;
		for (int i = 0; i < count; i++) {
			TableItem item = new CustomTableItem(table, SWT.NONE, i != 1);
			item.setText(1, "y");
			item.setText(2, "!");
			item.setText(3, "this stuff behaves the way I expect");
			item.setText(4, "almost everywhere");
			item.setText(5, "some.folder");
			item.setText(6, "line " + i + " in nowhere");
		}
		for (int i = 0; i < titles.length; i++) {
			table.getColumn(i).pack( );
		}
		table.setSize(table.computeSize(SWT.DEFAULT, 200));
		shell.pack( );
		shell.open( );
		while (!shell.isDisposed( )) {
			if (!display.readAndDispatch( )) {
				display.sleep( );
			}
		}
		display.dispose( );
	}
}

Java:
package table;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;

public class CustomTableItem extends TableItem {

	private Table table;
	private Button check;
	private boolean showCheck;

	public CustomTableItem(Table table, int style, boolean showCheck) {
		super(table, style);
		this.table = table;
		this.showCheck = showCheck;

		init( );
	}

	private void init() {
		if (showCheck) {
			check = new Button(table, SWT.CHECK);
			check.setBackground(table.getBackground( ));

			TableEditor te = new TableEditor(table);
			te.grabHorizontal = true;
			te.grabVertical = true;
			te.horizontalAlignment = SWT.LEFT;
			te.verticalAlignment = SWT.CENTER;

			te.setEditor(check, this, 0);
		}
	}

	public boolean isChecked() {
		return check.getSelection( );
	}

	@Override
	protected void checkSubclass() {
	}

}
 
Cool, danke, das klappt soweit:)
Nun habe ich aber das Problem, dass ich nicht an den Button rankomme.... Ich hab es so versucht:

Code:
 table.addSelectionListener(new SelectionListener()
  {
      public void widgetDefaultSelected(SelectionEvent e) 
       {				
       }

      public void widgetSelected(SelectionEvent e) 
	{
		for(int i=0; i<table.getItemCount(); i++)
		{
			if(table.getItem(i).isChecked)
                            System.out.println("Markierte Zeile: " + i);
		}
	}
        	
        });

oder so müsste es ja eigentlich klappen. Nur ist table.getItem(i).isChecked nicht verfügbar...
Oder hab ich einfach nur den falschen Listener?
 
Du hast ja auch kein normales TableItem sonder ein CustomTableItem.

Java:
for(int i=0; i<table.getItemCount(); i++)
		{
                        TableItem item = table.getItem(i);
                        if(item instanceof CustomTableItem){
                             CustomTableItem custom = (CustomTableItem)item;
			     if(custom .isChecked())
                                  System.out.println("Markierte Zeile: " + i);
                        }
		}
 
Oh, ok, ich kannst instanceof noch nicht.... das macht es natürlich etwas leichter :) Bin erst vor nem Monat zu Java gekommen, von daher;)

Ok, danke schonmal, ich werde dann mal damit ein wenig herumspielen
 
Komm wieder nicht weiter.... Nun ist die Anzeige der Checkboxen zwar korrekt, aber mit dem Listener klappt was nicht....

Ich hab es so programmiert, dass die erste Spalte geladen wird, da sich die checkboxen auf dieser befinden. Dann hab ich einen MouseUp-Listener darauf angesetzt. Da er durch System.out.println "kommentiert" ist und nix ausgibt, ist meine Vermutung, dass er aber gar nicht in den Listener springt

Code:
TableColumn col = table.getColumn(0);   
        col.addListener(SWT.MouseUp, new Listener()
        {
			public void handleEvent(Event event) 
			{
				System.out.println("springt in den Listener");
				for(int i=0; i<table.getItemCount(); i++)
		        {
					TableItem item = table.getItem(i);
					System.out.println("zählt die Zeilen");
		            if(item instanceof CustomTableItem)
		            {
		            	System.out.println("Instanz von costum");
		            	CustomTableItem custom = (CustomTableItem)item;
		                if(custom.isChecked())
		                	System.out.println("Markierte Zeile: " + i);
		            }
		        }				
			}
		});
 
Java:
package table;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;

public class CustomTableItem extends TableItem {

	private Table table;
	private Button check;
	private boolean showCheck;

	public CustomTableItem(Table table, int style, boolean showCheck) {
		super(table, style);
		this.table = table;
		this.showCheck = showCheck;

		init( );
	}

	private void init() {
		if (showCheck) {
			check = new Button(table, SWT.CHECK);
			check.setBackground(table.getBackground( ));

			TableEditor te = new TableEditor(table);
			te.grabHorizontal = true;
			te.grabVertical = true;
			te.horizontalAlignment = SWT.LEFT;
			te.verticalAlignment = SWT.CENTER;

			te.setEditor(check, this, 0);
		}
	}

	public void addSelectionListener(SelectionListener listener) {
		if (check != null) {
			check.addSelectionListener(listener);
		}
	}

	public void removeSelectionListener(SelectionListener listener) {
		if (check != null) {
			check.removeSelectionListener(listener);
		}
	}

	public boolean isChecked() {
		return check.getSelection( );
	}

	@Override
	protected void checkSubclass() {
	}
}

Java:
package table;

/*
 * Table example snippet: create a table (columns, headers, lines)
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 */
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

public class Snippet38 {

	public static void main(String[] args) {
		Display display = new Display( );
		Shell shell = new Shell(display);
		Table table = new Table(shell, SWT.MULTI | SWT.BORDER |
				SWT.FULL_SELECTION);
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		String[] titles = {" ", "C", "!", "Description", "Resource",
				"In Folder", "Location"};
		for (int i = 0; i < titles.length; i++) {
			TableColumn column = new TableColumn(table, SWT.NONE);
			column.setText(titles[i]);
		}

		int count = 10;
		for (int i = 0; i < count; i++) {
			final CustomTableItem item = new CustomTableItem(table,
					SWT.NONE,
					i != 1);
			item.addSelectionListener(new SelectionAdapter( ) {

				@Override
				public void widgetSelected(SelectionEvent evt) {
					System.out.println(item.getText(6) + " " + item.isChecked( ));
				}

			});

			item.setText(1, "y");
			item.setText(2, "!");
			item.setText(3, "this stuff behaves the way I expect");
			item.setText(4, "almost everywhere");
			item.setText(5, "some.folder");
			item.setText(6, "line " + i + " in nowhere");
		}
		for (int i = 0; i < titles.length; i++) {
			table.getColumn(i).pack( );
		}
		table.setSize(table.computeSize(SWT.DEFAULT, 200));
		shell.pack( );
		shell.open( );
		while (!shell.isDisposed( )) {
			if (!display.readAndDispatch( )) {
				display.sleep( );
			}
		}
		display.dispose( );
	}
}
 
Zurück