SWT Table CellEditor - knifflig

lumo

Top Contributor
hallo,

ich habe für meine tabelle folgende informationen

columnNames
columnClasses
visibility
editable

nun muss ich mir dynamisch eine tablle erstellen, in der automatisch die richtigen celleditoren für die richtige klasse zugewiesen werden. (hab mir für die verschiedenen klassen schon celleditoren zurechtgebastelt - die u.a. die eingabe einschränken/prüfen)
 
Zuletzt bearbeitet:

lumo

Top Contributor
meine lösung als kleines standalone programm
Code:
package snippets;

import java.util.LinkedList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
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 TableSample {

	protected Shell shell;
	private Table table;

	private String[] columnNames = { "id", "name", "single?" };
	private Class<?>[] classes = { Integer.class, String.class, Boolean.class };
	private Integer[] maxLengths = { null, 9, null };
	private Boolean[] editable = { false, true, true };
	private Boolean[] visible = { true, true, true };

	/**
	 * Launch the application.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TableSample window = new TableSample();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Open the window.
	 */
	public void open() {
		Display display = Display.getDefault();
		createContents();

		// generate field infos
		List<FieldInfo> infos = new LinkedList<FieldInfo>();
		for (int i = 0; i < columnNames.length; i++) {
			infos.add(new FieldInfo(columnNames[i], classes[i], maxLengths[i],
					editable[i], visible[i]));
		}
		// put data into table
		fill(infos);
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shell = new Shell();
		shell.setSize(450, 300);
		shell.setText("SWT-DTS [Dynamic Table Sample]");
		shell.setLayout(new FillLayout(SWT.HORIZONTAL));

		table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);

	}

	public void fill(List<FieldInfo> infos) {
		FieldInfo fi;
		// generate tablecolumns
		for (int i = 0; i < columnNames.length; i++) {
			fi = infos.get(i);
			TableColumn tableColumn = new TableColumn(table, SWT.NONE);
			if (fi.isVisibile()) {
				tableColumn.setResizable(true);
				tableColumn.setWidth(100);
			} else {
				tableColumn.setWidth(0);
				tableColumn.setResizable(false);
			}
			tableColumn.setText(fi.getName());
		}

		// add all table rows
		TableItem item1 = new TableItem(table, SWT.NONE);
		item1.setText(new String[] { "1", "Franz", "true" });
		TableItem item2 = new TableItem(table, SWT.NONE);
		item2.setText(new String[] { "2", "Fritz", "true" });
		TableItem item3 = new TableItem(table, SWT.NONE);
		item3.setText(new String[] { "3", "Vicky", "false" });
		TableItem item4 = new TableItem(table, SWT.NONE);
		item4.setText(new String[] { "4", "Eva", "false" });
		TableItem[] items = table.getItems();

		TableEditorForClass tefc = new TableEditorForClass();
		for (int column = 0; column < columnNames.length; column++) {
			for (int row = 0; row < items.length; row++) {
				try {
					fi = infos.get(column);
					TableEditor editor = new TableEditor(table);
					editor.grabHorizontal = true;
					editor.setEditor(tefc.getEditorFor(fi, items[row]
							.getText(column), table), items[row], column);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	private class TableEditorForClass {

		public Control getEditorFor(FieldInfo fi, String value, Composite parent) {
			Class<?> clazz = fi.getClazz();
			if (clazz.equals(String.class)) {
				Text txt = new Text(parent, SWT.NONE);
				txt.setText(value);
				txt.setTextLimit(fi.getMaxLength());
				txt.setEditable(fi.isEditable());
				return txt;
			} else if (clazz.equals(Integer.class)) {
				if (fi.isEditable()) {
					Spinner spin = new Spinner(parent, SWT.NONE);
					spin.setSelection(Integer.parseInt(value));
					return spin;
				} else {
					Text txt = new Text(parent, SWT.NONE);
					txt.setText(value);
					txt.setEditable(fi.isEditable());
					return txt;
				}
			} else if (clazz.equals(Boolean.class)) {
				Button button = new Button(parent, SWT.CHECK);
				Color white = Display.getCurrent().getSystemColor(
						SWT.COLOR_WHITE);
				button.setBackground(white);
				button.setSelection(Boolean.valueOf(value));
				button.pack();
				return button;
			} else {
				return new Text(parent, SWT.NONE);
			}
		}
	}

	private class FieldInfo {
		private String name;
		private Class<?> clazz;
		private Integer maxLength;
		private Boolean isEditable;
		private Boolean isVisibile;

		public FieldInfo(String aName, Class<?> aClass, Integer aMaxLength,
				Boolean isEditable, Boolean isVisible) {
			this.name = aName;
			this.clazz = aClass;
			this.maxLength = aMaxLength;
			this.isEditable = isEditable;
			this.isVisibile = isVisible;
		}

		public String getName() {
			return name;
		}

		public Class<?> getClazz() {
			return clazz;
		}

		public Integer getMaxLength() {
			return maxLength;
		}

		public Boolean isEditable() {
			return isEditable;
		}

		public Boolean isVisibile() {
			return isVisibile;
		}
	}
}
 
G

Gast2

Gast
Kannst du JFace verwenden?? Dann würde ich einen TableViewer benutzen
Code:
viewer.setCellEditors(editors);
und hiermit die CellEditoren setzen!!!
Oder du füllst deine Columns hiermit TableViewerColumn damit kannst auch einen Editor setzen...

Building and delivering a table editor with SWT/JFace
 
Zuletzt bearbeitet von einem Moderator:

lumo

Top Contributor
ja, ich kann verwenden was immer ich will.
werd mir das morgen in der arbeit gleich ansehen!

danke für den hinweis!
 

lumo

Top Contributor
interessant ist, dass der letzte link, den du mir geschickt hast, im prinzip das implementiert, was ich schon selbst programmiert habe... :)

-> genau anschauen und anwenden :D

DANKE, ich lass von mir hören, wenns weiter ging :D
 

lumo

Top Contributor
habe jetzt den tableviewer in meine view eingebaut.
habe aber nun das problem, dass alle daten um eine spalte (nach rechts) verschoben werden (nach links hätte ich das noch verstanden...)

habe einen ArrayContentProvider() verwendet.
ich weiss nicht, wie der zu seinen daten kommt und wo die erste leere spalte herkommt...
(eine leere spalte ist ok, da dort das icon rein kommt...)
 

Anhänge

  • problem.jpg
    problem.jpg
    76,4 KB · Aufrufe: 81
G

Gast2

Gast
Hab hier mal ein Bsp ist einfach mal runter gecodet da siehst du eigentlich wie und wo er die Sachen holt...
Java:
package snippet;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColorCellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;

/**
 * This class demonstrates CellEditors. It allows you to create and edit Person
 * objects
 */
public class TestEditor {

	public TestEditor(Shell parentShell) {
		createContents(parentShell);
	}

	/**
	 * Creates the main window's contents
	 * 
	 * @param parent
	 *            the main window
	 * @return Control
	 */
	protected Control createContents(Shell parent) {
		parent.setLayout(new FillLayout());
		String[] titles = { "Name", "Verheiratet", "Farbe", "Grußwort" };
		String[] prop = { "name", "verheiratet", "farbe", "grußwort" };
		Class<?>[] clazz = { String.class, Boolean.class, RGB.class,
				String.class };

		// Prozent angaben für die breite
		Integer[] percent = { 10, 25, 25, 20, 20 };
		Composite tableComposite = new Composite(parent, SWT.NONE);
		TableColumnLayout tableColumnLayout = new TableColumnLayout();
		TableViewer viewer = new TableViewer(tableComposite, SWT.SINGLE
				| SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);

		Table table = viewer.getTable();

		CellEditor[] editors = new CellEditor[5];
		editors[0] = new TextCellEditor(table);
		editors[1] = new CheckboxCellEditor(table);
		editors[2] = new ColorCellEditor(table);
		editors[3] = new ComboBoxCellEditor(table, new String[] { "Hi",
				"Hallo", "Tag" }, SWT.READ_ONLY);

		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		tableComposite.setLayout(tableColumnLayout);
		for (int i = 0; i < titles.length; i++) {
			final TableViewerColumn viewerNameColumn = new TableViewerColumn(
					viewer, SWT.NONE);
			viewerNameColumn.getColumn().setText(titles[i]);
			tableColumnLayout.setColumnData(viewerNameColumn.getColumn(),
					new ColumnWeightData(percent[i], 10, true));

			viewerNameColumn.setLabelProvider(new MyCellLabelProvider<Kunde>(
					prop[i], clazz[i]));
			viewerNameColumn.setEditingSupport(new MyCellEditingSupport(viewer,
					prop[i], editors[i]));
		}

		viewer.setContentProvider(new ArrayContentProvider());
		List<Kunde> list = new ArrayList<Kunde>();
		for (int i = 0; i < 5; i++) {
			Kunde k = new Kunde();
			k.setName("");
			k.setGrußwort("");
			k.setVerheiratet(true);
			k.setFarbe(new RGB(0, 0, 0));
			list.add(k);
		}
		viewer.setInput(list);
		return parent;
	}

	public static class MyCellLabelProvider<E> extends CellLabelProvider {

		private String property;
		private Class<?> clazz;

		public MyCellLabelProvider(String property, Class<?> clazz) {
			super();
			this.property = property;
			this.clazz = clazz;
		}

		@Override
		public void update(ViewerCell cell) {
			E element = (E) cell.getElement();
			try {
				Object o = getObject(property, element);
				if (o != null)
					cell.setText(clazz.cast(o).toString());
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	private static Object getObject(String property, Object element)
			throws SecurityException, NoSuchMethodException,
			IllegalArgumentException, IllegalAccessException,
			InvocationTargetException {

		char[] propName = property.toCharArray();
		propName[0] = Character.toUpperCase(propName[0]);
		String readGetterMethodName = "get" + new String(propName);
		Method method = element.getClass().getMethod(readGetterMethodName,
				new Class[] {});
		Object o = method.invoke(element, new Object[0]);
		return o;
	}

	private static void setObject(String property, Object element, Object set)
			throws IllegalArgumentException, IllegalAccessException,
			InvocationTargetException, SecurityException, NoSuchMethodException {

		char[] propName = property.toCharArray();
		propName[0] = Character.toUpperCase(propName[0]);
		String readGetterMethodName = "set" + new String(propName);
		Method method = element.getClass().getMethod(readGetterMethodName,
				new Class[] { set.getClass() });
		method.invoke(element, new Object[] { set });
	}

	class MyCellEditingSupport extends EditingSupport {
		private Viewer viewer;
		private String property;
		private CellEditor cellEditor;

		public MyCellEditingSupport(ColumnViewer viewer, String property,
				CellEditor cellEditor) {
			super(viewer);
			this.viewer = viewer;
			this.property = property;
			this.cellEditor = cellEditor;
		}

		@Override
		protected boolean canEdit(Object element) {
			return true;
		}

		@Override
		protected CellEditor getCellEditor(Object element) {
			// TODO Auto-generated method stub
			return cellEditor;
		}

		@Override
		protected Object getValue(Object element) {
			Object o = null;
			try {
				 o = getObject(property, element);
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if(cellEditor instanceof ComboBoxCellEditor){
				String[] items = ((ComboBoxCellEditor) cellEditor).getItems();
				for (int i = 0; i < items.length; i++) {
					if(items[i].equals(o)){
						cellEditor.setValue(i);
						return i;
					}
				}
				cellEditor.setValue(0);
				return 0;
			}
			return o;
		}

		@Override
		protected void setValue(Object element, Object value) {
			if(cellEditor instanceof ComboBoxCellEditor){
				String[] items = ((ComboBoxCellEditor) cellEditor).getItems();
				value = items[(Integer) cellEditor.getValue()];
			}
			
			try {
				setObject(property, element, value);
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// Force the viewer to refresh
			viewer.refresh();

		}
	}
	
	public static class Kunde {

		private String name;
		private Boolean verheiratet;
		public Boolean getVerheiratet() {
			return verheiratet;
		}
		public void setVerheiratet(Boolean verheiratet) {
			this.verheiratet = verheiratet;
		}
		public String getGrußwort() {
			return grußwort;
		}
		public void setGrußwort(String grußwort) {
			this.grußwort = grußwort;
		}
		public RGB getFarbe() {
			return rgb;
		}
		public void setFarbe(RGB rgb) {
			this.rgb = rgb;
		}
		private String grußwort;
		private RGB rgb;
		
		public void setName(String name) {
			this.name = name;
		}
		public String getName() {
			return name;
		}
		
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setLayout(new FillLayout());
		new TestEditor(shell);
		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}

		display.dispose();

	}

}
 

lumo

Top Contributor
hab jetzt rausgefunden (und den fehler behoben), was die spalte verschiebt.

werde mir dein beispiel jetzt genau anschauen und dann werd ich versuchen das in meinem projekt umzusetzen. :)

jetzt schonmal DANKE DANKE DANKE!
 
G

Gast2

Gast
hab jetzt rausgefunden (und den fehler behoben), was die spalte verschiebt.

werde mir dein beispiel jetzt genau anschauen und dann werd ich versuchen das in meinem projekt umzusetzen. :)

jetzt schonmal DANKE DANKE DANKE!

Kein Ding Wie gesagt musst halt noch ein bischen sauberer ausprogrammieren, aber ich denke so solltest jeden CellEditor hinbekommen...
Ich denk das Prinzip ist klar oder?
Ich weiß halt nicht wie man bei SWT Tabellen was anderes darstellen kann als Strings und Image!!!
 

lumo

Top Contributor
Ich weiß halt nicht wie man bei SWT Tabellen was anderes darstellen kann als Strings und Image!!!
mehr brauche ich ja auch nicht.
wenn ich meinen eigenen celleditor zusammenbasteln kann bin ich schon glücklich, zum darstellen brauch ich nicht mal images ;)
String und ne checkbox sind schon ok, wobei die checkbox als string auch ok ist (wenns auch anderst schöner wäre ;))

EDIT: bin noch beim drehen ;)
 
G

Gast2

Gast
Wie du in meinem beispiel siehst ist checkbox als text kein problem, aber wie man eine wirklich checkbox darstellt hab ich noch nicht hinbekommen
Du kannst noch SWT.CHECK mitgeben dann wird die 1. spalte als checkbox dargestellt, aber wie gesagt noch wie was mitgemacht und besonders toll find ich es auch nicht...

EDIT: Vielleicht findest du hier noch was interessanters
JFaceSnippets - Eclipsepedia
 
Zuletzt bearbeitet von einem Moderator:

lumo

Top Contributor
das mit der checkbox find ich schon noch raus...

hab grad ein lästiges problemchen:
das programm das ich schreibe, baut auf einer alten datenbank auf (nein, die hab ich nicht verbrochen :D)
und ich hab meine funktionen natürlich anderst benannt, als die columnnames in der tabelle.
nun kann ich nicht einfach per reflection die funktionen ermitteln... muss mir also ein mappingfile erstellen (100 columns dafür jeweils nen getter und setter.... uiuiui, da hab ich was zu tun! <ironie>yeah</irone>)
 
G

Gast2

Gast
Versteh ich jetzt nicht ist doch egal...
Du kannst columnnames doch anders benennen als die properties die er wirklich holt...
Übrigens meine reflection methode würde ich nicht verwenden diese beachtet keine is Methoden und keine get Methoden mit Objekte...
 
G

Gast2

Gast
Hier ist ein CellEditor der wikrlich eine checkbox anzeigt...
Fehlt nur noch das darstellen...

Java:
package command;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerRow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * @since 3.4
 *
 */
public class BooleanCellEditor extends CellEditor {
	private Button button;
	private ViewerRow row;
	private int index;
	private String restoredText;
	private Image restoredImage;
	private KeyListener macSelectionListener = new KeyListener(){
	
		public void keyReleased(KeyEvent e) {
			
		}
	
		public void keyPressed(KeyEvent e) {
			if( e.character == ' ' ) {
				button.setSelection(!button.getSelection());	
			}
		}
	};

	private boolean changeOnActivation;
	
	/**
	 * @param parent
	 */
	public BooleanCellEditor(Composite parent) {
		super(parent);
	}

	/**
	 * @param parent
	 * @param style
	 */
	public BooleanCellEditor(Composite parent, int style) {
		super(parent, style);
	}

	public LayoutData getLayoutData() {
		LayoutData data = super.getLayoutData();
		data.horizontalAlignment=SWT.CENTER;
		data.grabHorizontal = false;
		return data;
	}

	protected Control createControl(Composite parent) {
		Font font = parent.getFont();
		Color bg = parent.getBackground();

		button = new Button(parent, getStyle() | SWT.CHECK);
		button.setFont(font);
		button.setBackground(bg);

		button.addKeyListener(new KeyAdapter() {

			/* (non-Javadoc)
			 * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
			 */
			public void keyReleased(KeyEvent e) {
				if( e.character == SWT.ESC ) {
					fireCancelEditor();
				}
			}

		});

		return button;
	}

	protected Object doGetValue() {
		return new Boolean(button.getSelection());
	}

	protected void doSetValue(Object value) {
		boolean selection = Boolean.TRUE.equals(value);
		button.setSelection(selection);
	}

	protected void doSetFocus() {
		if (button != null) {
			button.setFocus();
		}
	}

	protected void deactivate(ColumnViewerEditorDeactivationEvent event) {
		super.deactivate(event);
		if( event.eventType == ColumnViewerEditorDeactivationEvent.EDITOR_CANCELED ) {
			row.setImage(index, restoredImage);
			row.setText(index, restoredText);
		}

//TODO Add a way to enable key traversal when CheckBoxes don't get focus
//		if( Util.isMac() ) {
//			button.getParent().removeKeyListener(macSelectionListener);
//		}
		
		row = null;
		restoredImage = null;
		restoredText = null;
	}

	public void activate(ColumnViewerEditorActivationEvent activationEvent) {
		ViewerCell cell = (ViewerCell)activationEvent.getSource();
		index = cell.getColumnIndex();
		row = (ViewerRow) cell.getViewerRow().clone();
		restoredImage = row.getImage(index);
		restoredText = row.getText(index);
		row.setImage(index, null);
		row.setText(index, ""); //$NON-NLS-1$
		
    	if (activationEvent.eventType != ColumnViewerEditorActivationEvent.TRAVERSAL && changeOnActivation) {
    		button.setSelection(!button.getSelection());
    	}
    	
//TODO Add a way to enable key traversal when CheckBoxes don't get focus
//    	if( Util.isMac() ) {
//    		button.getParent().addKeyListener(macSelectionListener);
//    	}
    	
    	super.activate(activationEvent);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.CellEditor#getDoubleClickTimeout()
	 */
	protected int getDoubleClickTimeout() {
		return 0;
	}
    
    public void setChangeOnActivation(boolean changeOnActivation) {
    	this.changeOnActivation = changeOnActivation;
    }
}
 

lumo

Top Contributor
kann es sein, dass die celleditoren mit null nicht zurechtkommen? ich lauf nämlich ständig in nullpointer-exceptions...

die reflection ist ok, hab jetzt ein map, das mir von der angefragten spalte den getter/setter-funktionsnamen gibt...
(einfaches file, schon fast wie ein properties :))
 
G

Gast2

Gast
kann es sein, dass die celleditoren mit null nicht zurechtkommen? ich lauf nämlich ständig in nullpointer-exceptions...

die reflection ist ok, hab jetzt ein map, das mir von der angefragten spalte den getter/setter-funktionsnamen gibt...
(einfaches file, schon fast wie ein properties :))

Nö eigentlich kein Problem...
Aber dein LabelProvider kommt damit nicht klar fehlt wahrscheinlich noch ne Abfrage
Java:
				if(o!= null){
						cell.setText(clazz.cast(o).toString());
					}else{
						cell.setText("");
					}
 

lumo

Top Contributor
auch das schau ich mir gleich morgen an :)

bei den columnnames meinte ich nicht die von der table (java) sondern die von der table (db-server) :lol:
 

lumo

Top Contributor
lol
nullpointer weg, jetzt kommt eine class cast exception (bin seit einiger zeit am suchen, wo die herkommt, bekomm nämlich keine normale ausgabe mit zeilenangaben sondern ein popup im rcp...)

edit: ich weiss nun dass es im celllabelprovider in update beim:
Code:
cell.setText(clazz.cast(o).toString());
hakt...
 

Anhänge

  • problem.PNG
    problem.PNG
    39,9 KB · Aufrufe: 56
Zuletzt bearbeitet:
G

Gast2

Gast
lol
nullpointer weg, jetzt kommt eine class cast exception (bin seit einiger zeit am suchen, wo die herkommt, bekomm nämlich keine normale ausgabe mit zeilenangaben sondern ein popup im rcp...)

Ja musst im log file schauen... Aber ich denke mal du hast eine falsche Klasse angegeben bei der Reflection irgendwo...
 

lumo

Top Contributor
was für ein log file??????:L:oops:

ich hab mir die reflection daten schon ausgeben lassen, bei den datentypen und den feldnamen scheint alles ok zu sein! :rtfm:

so nachdem ich jetzt ne runde gegangen bin (und der geist zur ruhe kam)
hab ich etwas gesehen, ich caste clazz (die aber in der funktion nicht gesetzt wird...)

-->
Code:
if (o != null) {
				cell.setText(o.getClass().cast(o).toString());
			} else {
				cell.setText("");
			}
und siehe da, wenn mans richtig macht kappts sogar :oops:
 
Zuletzt bearbeitet:
G

Gast2

Gast
was für ein log file??????:L:oops:

ich hab mir die reflection daten schon ausgeben lassen, bei den datentypen und den feldnamen scheint alles ok zu sein! :rtfm:

so nachdem ich jetzt ne runde gegangen bin (und der geist zur ruhe kam)
hab ich etwas gesehen, ich caste clazz (die aber in der funktion nicht gesetzt wird...)

-->
Code:
if (o != null) {
				cell.setText(o.getClass().cast(o).toString());
			} else {
				cell.setText("");
			}
und siehe da, wenn mans richtig macht kappts sogar :oops:

Ja ich hab mit dafür eine Klasse anlgelegt sowas in die Richtung... Und die übergeb ich meinen LabelProvider und Editingsupport... dann ist es eigentlich ziemlich easy...
Java:
	public static class CellProperty{
		private String property;
		private Class<?> castClass;
		private Integer widht;
                private String titel;
                private CellEditor cellEditor;
                //usw ...
                 
	
	}
 

lumo

Top Contributor
hab das selbe in meiner FieldInfo-klasse, bis auf den editor.

du hast geschrieben, du hast einen celleditor der ein bild darstellt... hast dazu auch code??
:)

was ich auch noch bräuchte wäre sowas wie ein floating window (als editor) wo dann einfach der wert zurückgegeben werden kann. (werde mir deinen BooleanCellEditor genauer anschauen, ev komm ich dann drauf ;))
 
G

Gast2

Gast
Nee ich hab nur den CellColorEditor... Mit Editoren hab ich noch nicht soviel gemacht...
Ich hab nur einen LabelProvider mit dem du Bilder(RGB Farben) darstellen kannst und den Normalen LabelProvider mit Font Background usw. Was mir als LabelProvider nocjh fehlt ist zum eine Checkbox oder Button darzustellen...
 

lumo

Top Contributor
klappt in jeder beliebigen spalte (solange der datetyp Boolean ist)
lol gar nicht gesehn... da muss ich wohl was mit dem boolean quer bekommen haben *nachsehn*

heute ist absolut NICHT mein tag

EDIT jetzt aber... dumm wenn man als test einfach true reinschreibt, für den wert der box... :D
 

Anhänge

  • sowas.PNG
    sowas.PNG
    3,3 KB · Aufrufe: 39
Zuletzt bearbeitet:
G

Gast2

Gast
Wo kann ich den Dateityp setzen ??Zeig mal bissl code oder ein kleines Beispiel wäre nett =)...
 

lumo

Top Contributor
ned dateityp, der datentyp vom feld, das du füllst...

hab bei mir den labalprovider umgeschrieben...

Code:
public MyCellLabelProvider(FieldInfo fi)
wobei fieldinfo folgende infos hält (// felder werden nur aus einer anderen klasse geerbt..)
Code:
	private Integer _index = -1; <-- index der column
	// extends _table <-- tabellenname in der datenbank
	// extends _name <-- name der column in der datenbank
	private String _friendlyName = ""; <-- angezeigter name
	private String _description = ""; <-- beschreibung aka tooltip
	private Boolean _isEditable = true; <-- darf mans editieren?
	private Boolean _isVisible; <-- solls angezeigt werden?

	// extends _class <-- datentyp in java
	// extends _maxFieldSize <-- maximale länge der eingabe (string/integer)

dann hab ich noch folgende update funktion
Code:
@Override
	public void update(ViewerCell cell) {
		E element = (E) cell.getElement();
		// element is instanceof Site
		try {
			Object o = getObject(fi.getColumnName(), element);
			if (o != null) {
				cell.setText(o.getClass().cast(o).toString());
			} else {
				cell.setText("");
			}
			if (!fi.isEditable()) {
				cell.setForeground(Display.getCurrent().getSystemColor(
						SWT.COLOR_DARK_GRAY));
				// cell.setBackground(new Color(Display.getCurrent(), 250, 250,
				// 250));
			}

			if (o != null && o.getClass().equals(Boolean.class)) {
				cell.setImage(new Image(Display.getCurrent(), new ImageData(
						String.format("C:/%s.PNG", (Boolean) o))));
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

fazit: ist ein fake, aber wem, ausser einem der programmieren kann, fällts auf :bahnhof:

PA: ist nur ne zwischenlösung :toll:
 
G

Gast2

Gast
Haha du setzt ein Bild rein... Naja muss auch irgendwie anders gehen^^!!!
Und jedes mal beim update ein neues Bild setzen ist auch so ne Sache, dann musst du das andere davor disposen... Und wenn du ein RCP hast würde ich Bilder über den Activator holen...

naja is editable braucsht du ja nicht wirklich dazu musst du eh ein EditingSupport setzen...
 
G

Gast2

Gast
du hast geschrieben, du hast einen celleditor der ein bild darstellt... hast dazu auch code??
:)

Was meinst du hier eigentlich?? gibst bei getImage einfach dein Bild zurück...

Wenn du es znetriert haben willst musst du es selber zeichen
PDUESOCODE

Java:
public static class MyLabelProvider  extends OwnerDrawLabelProvider

	protected void paint(Event event, Object element) {
			if(event.item == null || element == null) return;
			TableItem item = (TableItem)event.item;
	         event.gc.drawImage(image, x, y);

				}
			}
		}
 

lumo

Top Contributor
Was meinst du hier eigentlich?? gibst bei getImage einfach dein Bild zurück...
[/code]

ach war blödsinn... denn der labelprovider stellts ja dar... der editor lässts dich ja ändern...

PS: dass das bild nicht jedes mal neu geladen werden soll/darf/kann ist mir klar ;)

hab in meinem plugin eine klasse, die eine hashmap aus icons hat (singleton)
also wenn eine anfrage auf ein bild kommt wirds auf alle fälle nur einmal geladen, auch wenns 1000 mal im programm verwendet wird. :)

was mich wundert... swt gibts ja jetzt schon länger... und java schon laaaaange ...

wieso ist bis jetzt noch keiner auf die idee gekommen nen celleditor mit checkbox zu machen?!?!?!?!

EDIT: hab schon versucht ein image von einer checkbox zu machen, das problem war aber, dass die höhe/breite nicht auslesbar ist....

hier mein ansatz:
Code:
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
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.Label;
import org.eclipse.swt.widgets.Shell;

public class ButtonImageTest {

	protected Shell shell;
	private Button button;
	private Label label2;
	private Label label1;

	/**
	 * Launch the application.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			ButtonImageTest window = new ButtonImageTest();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Open the window.
	 */
	public void open() {
		Display display = Display.getDefault();
		createContents();
		System.out.println("bounds");
		System.out.println(button.getBounds().width);
		System.out.println(button.getBounds().height);
		System.out.println("size");
		System.out.println(button.getSize().x);
		System.out.println(button.getSize().y);
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shell = new Shell();
		shell.setSize(450, 300);
		shell.setText("SWT Application");
		shell.setLayout(new GridLayout(1, false));

		button = new Button(shell, SWT.CHECK);
		button.setText("Check Button");

		label1 = new Label(shell, SWT.NONE);
		label1.setText("image from file");
		label1
				.setImage(new Image(
						Display.getCurrent(),
						new ImageData(
								"D:/JAVA/BIOOFFICE_WORKSPACE/BioOffice3SiteEditorPlugin/res/images/delete.gif")));
		label2 = new Label(shell, SWT.NONE);
		label2.setText("image of checkbox");
//		label2
//				.setImage(getImageOf(button));		
	}
	
	public Image getImageOf(Control control) {
		Image img = null;
		try {
			Robot robot = new Robot();

			Rectangle captureSize = new Rectangle(
					control.toDisplay(0, 0).x, control.toDisplay(0, 0).y, control.getBounds().width,
					control.getBounds().height);
//			Rectangle captureSize = new Rectangle(
//					control.toDisplay(0, 0).x, control.toDisplay(0, 0).y, control.getSize().x,
//					control.getSize().y);
			BufferedImage bufferedImage = robot
					.createScreenCapture(captureSize);
			img = new Image(Display.getCurrent(), ImageConvert
					.convertToSWT(bufferedImage));
		} catch (AWTException e) {
			System.err.println("Someone call a doctor!");
		}
		return img;
	}
}
 
Zuletzt bearbeitet:
G

Gast2

Gast
Nee ich werd schon noch eine gescheite Lösung finden...
Warum du hast doch einen BooleanCellEditor der reicht doch...
Ich will den Boolean ohne Bild nur noch gescheit darstellen der rest tut alles wunderbar...

Schon mal geschafft einen TooltTip darzustellen?? Ich überschreib die methode getToolTip aber wird nie was angezeigt...
 

lumo

Top Contributor
ich mach die tooltips nur in den table columns, also oben in der tabelle, unten, bei der zelle selbst find ich dass es nur verwirrend und unübersichtlich wird...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
J Anbindung Textfeldklasse an Table funktioniert nicht AWT, Swing, JavaFX & SWT 3
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
S JavaFX Boolean ändern Table View AWT, Swing, JavaFX & SWT 14
B JavaFX JavaFX Table gespeichertes Wert auswählen/anvisieren AWT, Swing, JavaFX & SWT 3
C TableModel zugehörige Table ermitteln AWT, Swing, JavaFX & SWT 3
T Table Renderer AWT, Swing, JavaFX & SWT 2
T Default Table wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
E JavaFX Von der Table-Cell zur Row AWT, Swing, JavaFX & SWT 0
A JavaFX Table Delete Row AWT, Swing, JavaFX & SWT 5
N JavaFX Problem mit table multiple selection AWT, Swing, JavaFX & SWT 5
D JavaFX Table Filter AWT, Swing, JavaFX & SWT 4
R Swing JTable : Header der Spalten ergänzen mit caption (wie bei html-table) AWT, Swing, JavaFX & SWT 2
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
J JTabbedPane: table in new tab: tooltip benutzt die column-widths von table in erstem geöffneten tab AWT, Swing, JavaFX & SWT 17
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
M MouseListener auf table oder scrollPane AWT, Swing, JavaFX & SWT 11
T SWT checkbox in table AWT, Swing, JavaFX & SWT 6
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
Z JavaFX Table mit MenuButton AWT, Swing, JavaFX & SWT 6
T SWT Table (mit Spinner Spalte) Daten auslesen AWT, Swing, JavaFX & SWT 4
E extended Swing Table AWT, Swing, JavaFX & SWT 2
J Einträge aus Table löschen ohne Exception AWT, Swing, JavaFX & SWT 6
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
E SWT Popupmenu auf der Überschrift eines swt.widgets.Table verhindern? AWT, Swing, JavaFX & SWT 3
Nicklas2751 Table View zeigt keinen Inhalt nur leere Zeilen AWT, Swing, JavaFX & SWT 2
reibi SWT SWT - Table AWT, Swing, JavaFX & SWT 8
A Swing JButton in einer Table Cell AWT, Swing, JavaFX & SWT 9
lumo SWT JFace Databinding +Custom Table AWT, Swing, JavaFX & SWT 2
M SWT - Table deselecten AWT, Swing, JavaFX & SWT 2
R SWT | Table | Zeilenkopf AWT, Swing, JavaFX & SWT 2
M SWT Table disabled und Scrollbar enabled AWT, Swing, JavaFX & SWT 11
C [SWT] Widget Table verliert nach Sortierung farbige / eingefärbter Background / Zellen AWT, Swing, JavaFX & SWT 3
L Inhalt einer table löschen AWT, Swing, JavaFX & SWT 2
L Jbutton in table AWT, Swing, JavaFX & SWT 2
lumo SWT Table Selection Color +Focus Out AWT, Swing, JavaFX & SWT 14
S SWT Maximum an Items in Table? AWT, Swing, JavaFX & SWT 2
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
Q SWT Mindetsgröße für Table AWT, Swing, JavaFX & SWT 7
1 Swing manual resize table column to min size AWT, Swing, JavaFX & SWT 2
hdi SWT SWT Table: 2 kleine Probleme AWT, Swing, JavaFX & SWT 4
S SWT Table Größen verändern AWT, Swing, JavaFX & SWT 10
lumo SWT Table und Klassen AWT, Swing, JavaFX & SWT 14
M SWT Table mit Columns und Items AWT, Swing, JavaFX & SWT 3
L Java Table AWT, Swing, JavaFX & SWT 4
F Swing J(X)Table Spalten umsortieren NUR im View (Wie finde ich eine Spalte nach Name?) AWT, Swing, JavaFX & SWT 3
A SWT Table mit Bildern und Checkboxes AWT, Swing, JavaFX & SWT 4
A SWT Table hat keine Scrollbar AWT, Swing, JavaFX & SWT 12
A SWT Table clearAll() und zurücksetzen. AWT, Swing, JavaFX & SWT 3
K SWT Table Modell / Datenmodell AWT, Swing, JavaFX & SWT 14
S Table oder TableModel so ueberschreiben, dass Columns minimale Breite haben? AWT, Swing, JavaFX & SWT 2
T SWT - Table Events AWT, Swing, JavaFX & SWT 3
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
T Fokus auf CB in Table mit beliebiger Taste AWT, Swing, JavaFX & SWT 12
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6
S Seltsam: SWT Table zeigt keine Scrollbar an AWT, Swing, JavaFX & SWT 12
G SWT-Table sortieren AWT, Swing, JavaFX & SWT 12
T Input-Check bei Textfeldern in Table AWT, Swing, JavaFX & SWT 5
G SWT Table Controll AWT, Swing, JavaFX & SWT 7
L SWT-Table: Datum ausgeben? AWT, Swing, JavaFX & SWT 5
G Table in SWT AWT, Swing, JavaFX & SWT 2
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
S SWT Table - Wie Columns hinzufügen / entfernen AWT, Swing, JavaFX & SWT 3
K javax.swing.table.TableRowSorter AWT, Swing, JavaFX & SWT 13
I JComboBox in Table AWT, Swing, JavaFX & SWT 4
G wo wird die table mit daten gefüllt? oô AWT, Swing, JavaFX & SWT 4
S SWT Drag&Drop / Table AWT, Swing, JavaFX & SWT 9
E JTable-während der Einfügezeit der Zellen in die Table AWT, Swing, JavaFX & SWT 2
S table - combobox AWT, Swing, JavaFX & SWT 7
D Selection SWT Table AWT, Swing, JavaFX & SWT 5
D SWT Table AWT, Swing, JavaFX & SWT 5
P Table Layout remove()? AWT, Swing, JavaFX & SWT 2
W Zeile in Table (SWT) selektieren und auslesen AWT, Swing, JavaFX & SWT 4
G Dringend ! SWT-Table übernimmt Änderung nicht AWT, Swing, JavaFX & SWT 2
L Multiline Table AWT, Swing, JavaFX & SWT 3
R SWT: Icons im Table vor den Einträgen AWT, Swing, JavaFX & SWT 3
T mit rechter maustaste Table row selektieren AWT, Swing, JavaFX & SWT 2
F Zeilenhöhe bei SWT Table AWT, Swing, JavaFX & SWT 3
S Nochmal Spaltenbriete im Table AWT, Swing, JavaFX & SWT 2
G mal wieder table. AWT, Swing, JavaFX & SWT 3
V SWT Table mit SWT.CHECK AWT, Swing, JavaFX & SWT 2
P SWT table updaten AWT, Swing, JavaFX & SWT 7
S Frage zu Table(Column)Model AWT, Swing, JavaFX & SWT 3
J ScrollPanel mit 2 Table`s AWT, Swing, JavaFX & SWT 5
J Table Model AWT, Swing, JavaFX & SWT 2
J Abstract Table Model AWT, Swing, JavaFX & SWT 7
T in einer Table soll jede zweite Zeile markiert werden AWT, Swing, JavaFX & SWT 3
E Inhalt einer Zelle eine Table in ein TextField bekommen AWT, Swing, JavaFX & SWT 24
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
K Swing CellEditor für einzelne Zellen AWT, Swing, JavaFX & SWT 2
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
E Swing CellEditor bei Fokusverlust Bearbeitung beenden?! AWT, Swing, JavaFX & SWT 6
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
lumo SWT CellEditor & Popup AWT, Swing, JavaFX & SWT 3
D SWT JFace TableViewer nächster CellEditor nach Enter aktivieren AWT, Swing, JavaFX & SWT 5
dzim JFace ListViewer-Einträge mit CellEditor? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben