Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich hab eine View mit einer TreeViewer gebaut, die nix anderes als mein Laufwerk "C" abzubilden.
Ich hab den Input als new File("C:/") übergeben.
Kann ich irgendwie meinen TreeViewer als xml abspeichern?
Ich will das komplette Laufwerk als XML darstellen.
Man speichert keine Oberfläche, sondern Modelle. Der TreeViewer zeigt dir dann dieses Modell ab.
Du kannst die gewünschte Struktur zB mit EMF modellieren. EMF Modelle kannst du dann automatisch in einem TreeViewer anzeigen lassen und auch als XML speichern.
ich hab es über EMF gemacht, hab nur gedacht dass es auch schöne Varianten gibt ein Abbild des "Ordners" TreeViewers zu machen.
Weil ich beispielsweise ein Laufwerk durchlaufe, hängt meine Oberfläche auf, trotz des UI-Threads.
Gibts da eine Möglichkeit den Aufruf der Methode zum Durchlaufen des Laufwerks, ohne dass die UI einfriert?
Zeitintensive Operationen dürfen nicht im UI Thread erfolgen.
Du hast im Prinzip 3 Möglichkeiten:
1. Erst ein komplettes Modell im Hintergrund aufbauen und das dann anzeigen
2. On-the-fly im Content Provider berechnen (diese Möglichkeit funktioniert nur wenn die Berechnung für ein einziges getChildren() nicht lange dauert
3. Einen Lazy Tree verwenden der asynchron nachlädt
im Grunde genommen mache ich die Option 3.
Nach ein paar Sekunden beim betätigen des "Durchlaufs" blockiert die Methode
die UI, obwohl ich bis dahin noch nicht auf den TreeViewer zugreife, sondern nur
das Laufwerk durchiteriere und nebenbei das Modell befülle.
Beim Testen der Methode habe ich gemerkt dass er auf die gleiche Thread (=main) wie die UI (=main)
zugreift.
Java:
@Override
public void widgetSelected(SelectionEvent e) {
PlatformUI.createDisplay().asyncExec(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
TreeView view = (TreeView) RCPUtil.getInstance().findView(TreeView.ID);
FolderUtil util = new FolderUtil();
DirectoryDialog dd = new DirectoryDialog(new Shell());
String choosePath = dd.open();
File dir = null;
if(choosePath!=null){
dir = new File(choosePath);
DriveCon con = ModelProvider.getInstance().createDrive();
DriveFactory factory= DriveFactory.eINSTANCE;
Folder folder = factory.createFolder();
folder.setName(dir.getName());
con.getEntries().add(folder);
util.listDir(dir, folder);
ModelProvider.getInstance().setDrive(con);
view.getViewer().setInput(ModelProvider.getInstance().getDrive());
// view.getTreeViewer().expandToLevel(2);
}
}
});
}
Im Grunde genommen müsste es in einem separaten Thread (Hintergrund) laufen oder?
Wenn nicht, wie kann es tun, so dass die UI nicht einfriert?