Best Practices - SWT-Tabelle, TableViewer, EditingSupport
Bin ich eine Tabelle hinzufügen meine Haupt-GUI. Es ist angezeigt und die Daten hat es wohl zeigen. Aber ich habe das Gefühl, ein großes Durcheinander von code, und es ist nicht richtig strukturiert. Ich bin auf der Suche nach jemandem, der verwendet SWT eine Menge, um mir zu helfen, die richtigen Teile des Codes an den richtigen stellen.
Klasse Eine Main-GUI mit TableViewer
Klasse B (ArrayList
) Daten für Tabelle /Klasse B1 - DataModel für ArrayList
Struktur
Klasse A - hat-Methode für die Erstellung TableViewer
//////////////////////////////////////////////////////////////////////////
// createTableViewer() //
//////////////////////////////////////////////////////////////////////////
private TableViewer createTableViewer(Composite parent) {
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
createColumns(parent, viewer);
table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
//Layout the viewer
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
viewer.setContentProvider(new ArrayContentProvider());
*** Getting Array from Class B ***
viewer.setInput(AplotDataModel.getInstance().getArrayData());
viewer.getControl().setLayoutData(gridData);
return viewer;
}
Klasse A hat auch createColumns()
Methode und eine createTableViewerColumn()
Methode.
//////////////////////////////////////////////////////////////////////////
// createColumns() //
//////////////////////////////////////////////////////////////////////////
private void createColumns(final Composite parent, final TableViewer viewer) {
String[] titles = { "ItemId", "RevId", "PRL", "Dataset Name", "EC Markup" };
int[] bounds = { 150, 150, 100, 150, 100 };
TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
AplotDatasetData item = (AplotDatasetData) element;
return item.getDataset().toString();
}
});
col = createTableViewerColumn(titles[1], bounds[1], 1);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
AplotDatasetData item = (AplotDatasetData) element;
return item.getRev().toString();
}
});
col = createTableViewerColumn(titles[2], bounds[2], 2);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
AplotDatasetData item = (AplotDatasetData) element;
return item.getPRLValue();
}
});
col = createTableViewerColumn(titles[3], bounds[3], 3);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
AplotDatasetData item = (AplotDatasetData) element;
return item.getDatasetName();
}
});
col = createTableViewerColumn(titles[4], bounds[4], 4);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
AplotDatasetData item = (AplotDatasetData) element;
return item.getECMarkupValue();
}
});
}
//////////////////////////////////////////////////////////////////////////
// createTableViewerColumn() //
//////////////////////////////////////////////////////////////////////////
private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) {
final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(title);
column.setWidth(bound);
column.setResizable(true);
column.setMoveable(true);
return viewerColumn;
}
Frage 1: Ist das die beste Praxis, hinzufügen einer Tabelle in meiner GUI-Klasse? Scheint wie eine Menge code für die GUI-Klasse.
Frage 2: Sollte die createColumns()
- Methode und die createTableViewerColumn()
Methode verschoben werden, um der Klasse B?
Frage 3: Meine Letzte Spalte in der Tabelle wird ein dropdown/ComboBox. Also ich werde zu haben, um erweitern einer Klasse mit EditingSupport
. Sollte es sein, Klasse A oder der Klasse B?
Bevor ich weiter mit diesem Projekt möchte ich sicherstellen, dass ich es richtig strukturiert ist.
InformationsquelleAutor der Frage jkteater | 2012-09-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beantwortung dieser Frage gerne beantworten, welche Eis-Geschmacksrichtung gefällt Euch 🙂
Q & A
Wenn der code weniger als Ihre nicht eine schlechte Idee. Aber wenn -
Table
ist ausreichend, aber in Zukunft werde ich verwendenGrid
.Ich normalerweise lieber sub-Klasse der Betrachter/- Kontrolle. Auf diese Weise konnte ich halten die Trennung zwischen den bare-bone-Nachricht Pumpen code, GUI-controls und meine Daten-Modell.
Nein, Sie sollten nicht. Wie in Ihrem Fall die Klasse B ist, Ihre Daten model/Lieferanten. Die JFace-Programmiermodell unterstützt die MVC-Architektur und-wenn möglich-sollte man Folgen. Vorgeschlagene Lösung ist eine neue Klasse, die sich den TableViewer.
Ich würde vorschlagen, dass Sie gehen, um eine neue Klasse und verwenden Sie, dass in der erweiterten TableViewer. Ein Vorteil ist, dass wenn Sie sind das schreiben der Daten zurück auf einige db dann Ihre viewer-Klasse bleiben db/persistence-layer-Agnostiker.
Code-Beispiel
Unten ist ein einfaches Beispiel-Anwendung. Wie Sie sehen können, die ich ändern kann, ist mein combo-editor, text-editor, nur durch eine änderung der
OptionEditingSupport
Klasse. Und auch der code sieht sauber und übersichtlich.Main-Klasse
Erweiterte Tabellen-Viewer
Content-Provider
Cell-Editor Unterstützung
Daten Modell
Die Person-Entität
InformationsquelleAutor der Antwort Favonius
Student TableViewer
Klasse : Schüler
Ich bekam best practices für SWT-Tabelle, TableViewer
Dank..
InformationsquelleAutor der Antwort Chetan Bhagat