ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
1512
1512
EMPFEHLEN
-
Einfache Frage - Schwierige Antwort!!
Ich erzeuge eine virtuelle Tabelle a la:. Dieser Viewer wird von einem ContentProvider gefüttert, der eigentlich nur das InterfaceCode :1
TableViewer v = new TableViewer(shell, SWT.VIRTUAL);
mit der MethodeCode :1
ILazyContentProvider
implementieren muss. Bei jedem Aufruf der Update-Funktion aus dem Viewer heraus, wird der Viewer über ein Handle bei index aktualisiert:Code :1
void updateElement(int index)
.Code :1
viewer.replace(model.getObject(index), index);
Damit lassen sich meines Erachtens aber nur eindimensionale Tabellen erzeugen (also eine Spalte mit gegebenem Zeilen'index'. Jetzt meine Frage: Wie implementiert man eine Tabelle mit mehreren Spalten als Virtual? (Ich will die an die Tabelle gelieferten Daten erst bei Abfrage liefern).
Hut ab vor dem, der dazu eine lösende Antwort weiß oder sich damit auskennt.
-
14.01.09 23:32 #2
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
schau mal hier:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
package de.tutorials; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ILazyContentProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.ApplicationWindow; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; 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.TableColumn; public class JFaceTableViewerExample extends ApplicationWindow { TableViewer tableViewer; Model model; public JFaceTableViewerExample(Shell parentShell) { super(parentShell); } @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setSize(640, 480); } protected Control createContents(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); GridLayout gridLayout = new GridLayout(1, false); composite.setLayout(gridLayout); String[] columnNames = new String[] { "COLUMN_A", "COLUMN_B", "COLUMN_C" }; tableViewer = new TableViewer(composite, SWT.VIRTUAL); tableViewer.setColumnProperties(columnNames); TableColumn tableColumn = new TableColumn(tableViewer.getTable(), SWT.NULL); tableColumn.setText(columnNames[0]); tableColumn.setWidth(100); tableColumn = new TableColumn(tableViewer.getTable(), SWT.NULL); tableColumn.setText(columnNames[1]); tableColumn.setWidth(100); tableColumn = new TableColumn(tableViewer.getTable(), SWT.NULL); tableColumn.setText(columnNames[2]); tableColumn.setWidth(100); tableViewer.setContentProvider(createContentProvider()); tableViewer.setLabelProvider(createLabelProvider()); tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); tableViewer.getTable().setLinesVisible(true); tableViewer.getTable().setHeaderVisible(true); tableViewer.setUseHashlookup(true); model = (Model) createInput(); tableViewer.setInput(model); tableViewer.setItemCount(model.getData().size()); Button btnUpdate = new Button(composite, SWT.PUSH); btnUpdate.setText("update"); btnUpdate.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { long time = System.currentTimeMillis(); model.getData().add( new Object[] { "A_" + time, "B_" + time, null }); tableViewer.setItemCount(model.getData().size()); } }); return composite; } static class Model { List<Object[]> data = new CopyOnWriteArrayList<Object[]>(); public List<Object[]> getData() { return data; } } private Object createInput() { Model model = new Model(); model.data.add(new Object[] { "A_0", "B_0", null }); return model; } class TableLabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { return ((Object[]) element)[columnIndex].toString(); } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } } private IBaseLabelProvider createLabelProvider() { return new TableLabelProvider(); } class ContentProvider implements ILazyContentProvider, IStructuredContentProvider { Model model; public Object[] getElements(Object inputElement) { return this.model.data.toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { System.out.println("inputChanged"); this.model = (Model) newInput; } public void updateElement(int index) { Object[] row = model.getData().get(index); row[2] = row[0] + " " + row[1]; tableViewer.replace(row, index); } } private IContentProvider createContentProvider() { return new ContentProvider(); } /** * @param args */ public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); JFaceTableViewerExample example = new JFaceTableViewerExample(shell); example.setBlockOnOpen(true); shell.pack(); example.open(); } }
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
"Darimont schrieb... und es wurde Licht."
Ich habe mal wieder viel zu kompliziert gedacht, aber richtig: in dem punkt unterscheidet sich ja der TableViewer nicht von virtual und non-virtual. aber danke für die präziese antwort - bei dir lernt man immer dazu. ich wäre zum beispiel nie auf die verwendung der threadsicheren CopyBeforeWriteArrayList() gekommen.
Das ist ein toller Gedanke. Habe noch nie vorher gehört von. Kenne nur das Konzept aus einigen Eclipse-Codes (zum Beispiel die modifizierenden Methoden der ListenerList.class von org.eclipxe.? )
Danke!
Hier noch einmal die Zusammenfassung meines dadurch gelösten Problems:
Code :1 2 3 4
1. i instantiated a new virtual TableViewer 2. i added (for example 2) TableColumns to the TableViewer and set their width 3. i set my own TableLabelProvider to the TableViewer in which 'getColumnText' i returned following: "return ((Object[]) element)[columnIndex].toString();" 3. thus i can set a ILazyTableProvider to my TableViewer implementing the 'updateElement'-method e.g. like this: "viewer.replace(new Object[] { model.getCol(0).getObject(index), model.getCol(1).getObject(index) }, index);"
Ähnliche Themen
-
bestimmte Zeile in einer tableviewer markieren(Plugins,jface,tableviewer):-(:-(
Von daniel38 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 16.12.10, 11:01 -
ListView mit mehreren Spalten
Von andralin im Forum .NET WPF & SilverlightAntworten: 0Letzter Beitrag: 27.03.09, 15:26 -
SWT Table mit mehreren Spalten
Von KlaDi im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 05.03.07, 13:35 -
SQL-Abfrage mit mehreren Ergebnissen (Spalten)
Von CT06 im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 19.07.06, 13:42 -
ListBox mit mehreren Spalten
Von d-Stench im Forum .NET Windows FormsAntworten: 2Letzter Beitrag: 29.08.05, 18:53





Zitieren

Login





