RCP - View aktualisieren

mtk-flo

Erfahrenes Mitglied
Hallo...

Ich habe zwei Views (NavigationView & KatalogView).

In der NavigationView ist ein Tree, den ich mit Daten aus einem XML fülle:

Code:
- A 
|- A1 
  |- A11 
  |- A12 
|- A2 
  |- A21 
- B 
|- B1 
  |- B11 
|- B2 
  |- B21 
  |- B22

Wenn ich nun auf z.B.: A11 klicke, sollen weitere Punkte aus dem XML ausgelesen werden (die im XML vorhanden sind - jedoch nicht im Tree) und in die KatalogView geschrieben werden.

Wie kann ich die KatalogView dynamisch füllen, ohne jedesmal eine neue Instanz von KatalogView zu öffen.
Ich will in der KatalogView eine Tabelle dynamisch füllen, weiß aber nicht so recht wie ich die Daten in die View gebe, dass sie sich aktualisiert.
 
Hallo,

wenn du einen JFace - TableViewer verwendest, musst du ja nur deine zusätzlichen Daten in die Datenstruktur des Viewers einfügen und nach einem Refresh des Viewers werden die neuen Daten automatisch auf der GUI angezeigt.

mfg
gello
 
Ich versuche jetzt schon seit geraumer Zeit einen TableViewer an meine Table anzubinden, jedoch klappt es nicht.
Kann mir mal jemand ne Hilfestellung geben, dass ich weiter komme?

Hier baue ich meine Tabelle auf:
Code:
  Table table = new Table(head, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
  GridData tableData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2);
  table.setLayoutData(tableData);
  table.getHorizontalBar();
  table.getVerticalBar();
 
// Hier hole ich Daten aus einem XML und später füge ich Sie dann in meine Tabelle hinzu...
  File XMLDatei = new File("C:/Dokumente und Einstellungen/"+ System.getProperties().getProperty("user.name") +"/Anwendungsdaten/GVAudit/AntwortenKatalog.xml");
     Persistenz xml = new Persistenz(XMLDatei, "pruefungskatalog.generated");
     KatalogTyp katalog = null;
  try {
   katalog = (KatalogTyp) xml.XMLtoObj();
  } catch (JAXBException e) {
   e.printStackTrace();
  } 
 
// "katalog" enthält nun mein ganzes XML, nun gebe ich ein Teil des XML's in die Tabelle ein...
  for (int i=0; i<katalog.getThema().get(0).getKategorie().get(0).getUnterkategorie().get(0).getEintrag().size(); i++) {
   TableItem item = new TableItem (table, 0);
   item.setText (katalog.getThema().get(0).getKategorie().get(0).getUnterkategorie().get(0).getEintrag().get(i).getFrage());
  }
 
Servus,

hier ein Artikel von Eclipse.org zu diesem Thema:
http://www.eclipse.org/articles/Article-Table-viewer/table_viewer.html

In meiner RCP Anwendung hab ich's folgender maßen gemacht:

Zuerst eine Instanz des TableViewers erstellen
Code:
TableViewer myTViewer = new TableViewer(top,SWT.SINGLE);
Anschließend hab ich meine Tabelle aus dem Viewer erstell.
Code:
Table myTable = myTViewer.getTable();
Dann noch die einzelnen Spalten erstellt
Code:
for(int i=0;i<5;i++){
  TableColumn tablecolumn = new TableColumn(myTViewer,SWT.NONE)
  tablecolumn.setWifth(100);
}
Natürlich muss auch noch ein Content- und LabelProvider definiert werden
Code:
myTViewer.setContentProvider(IContentProvider);
myTViewer.setLabelProvider(IBaseLabelProvider);
Und zu guter letzt noch die Datenstruktur dem Viewer zuweisen.
Code:
myTViewer.setInput(Object);

Denke so müsste es funktionieren, zumindest tut es das bei mir :D
 
Habe es nun aufgebaut wie du gesagt hast:

TableViewer initialisieren:
Code:
TableViewer myTViewer = new TableViewer(head, SWT.SINGLE);

Tablle mit dem TableViewer verbinden
Code:
Table table = myTViewer.getTable();
GridData tableData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2);
table.setLayoutData(tableData);
table.getHorizontalBar();
table.getVerticalBar();

IContentProvider & IBaseLabelProvider:
Code:
IContentProvider IContentProvider = new IContentProvider() {
 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 }
 public void dispose() {
 }
};
IBaseLabelProvider IBaseLabelProvider = new IBaseLabelProvider() {
 public void removeListener(ILabelProviderListener listener) {
 }
 public boolean isLabelProperty(Object element, String property) {
  return false;
 }
 public void dispose() {
 }
 public void addListener(ILabelProviderListener listener) {
 }
};

Code:
myTViewer.setContentProvider(IContentProvider);
myTViewer.setLabelProvider(IBaseLabelProvider);

Jetzt habe ich versucht, meine Table zu füllen -> schlug Fehl,
das gleich beim TableViewer :/

Ich bekomm immer den Fehler:
Code:
Unable to create view: Assertion failed:
org.eclipse.jface.util.Assert$AssertionFailedException: Assertion failed:
Er zeigt an, dass der Fehler in der Zeile liegt:
myTViewer.setContentProvider(IContentProvider);
 
Ups,

dein ContentProvider muss ein IStructuredContentProvider sein, da der TableViewer auch von StructuredViewer abgeleitet ist.
Somit muss noch die Funktion
Code:
public Object[] getElements(Object inputElement);
implementiert werden.


Sorry, hab ich vorher überlesen :-(
 
Ja, so geht es
Code:
myTViewer.setContentProvider(new IStructuredContentProvider() {
 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
 }
 public void dispose() {
 }
 
 public Object[] getElements(Object inputElement) {
  
  return null;
 }
});

Musst auch den IBaseLabelProvider auf ITableLabelProvider ändern...

Nur befüllen kann ich mein TableViewer nicht.
Im Beispiel bei eclipse.org verwenden die einee "taskList", ist das einfach eine ArrayList?

Wenn ich zum Testen:
Code:
Object obj = new Object();
obj = "moep";
myTViewer.setInput(obj);
eingebe, kommt der Fehler:

org.eclipse.jface.util.Assert$AssertionFailedException: null argument;

Bisher habe ich meine IStructedContentProvider- & ITableLabelProvider-Klassen leer gelassen, weil ich nicht genau weiß, was rein muss

 
Der Fehler liegt am Rückgabewert null in deiner getElements()

Bei dem Tutorial ist auch der SourceCode dabei.
Schau dir doch da mal die IStructedContentProvider- & ITableLabelProvider-Klassen genauer an.
 
Zurück