ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
1018
1018
EMPFEHLEN
-
Hallo zusammen,
ich habe folgendes kleines Problem:
Wenn in Eclipse meine View geschlossen wird, möchte ich darauf reagieren können.
Nun hab ich das Problem, dass ich keinen Punkt finde, an dem ich da einsteigen könnte.
Gibt es keinen Listener der reagiert, wenn die View "geschlossen" (=setVisible(false)) wird?
Mit der setFocus() Methode der View das leider net.
Für jeden Tipp dankbar,
Gruß,
Crai
-
22.02.06 10:52 #2
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Du koenntest deine View das org.eclipse.ui.ISaveablePart/org.eclipse.ui.ISaveablePart2 Interface implementieren lassen. Damit bekommst du Moeglichkeiten das Speichern der View beim schliessen zu steuern.
Du koenntest auch einen PartListener in createPartControl implementieren:
Code :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
/** * This is a callback that will allow us * to create the viewer and initialize it. */ public void createPartControl(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setSorter(new NameSorter()); viewer.setInput(getViewSite()); makeActions(); hookContextMenu(); hookDoubleClickAction(); contributeToActionBars(); getViewSite(). getPage(). addPartListener(new IPartListener(){ public void partActivated(IWorkbenchPart part) { System.out.println("partActivated"); } public void partBroughtToTop(IWorkbenchPart part) { System.out.println("partBroughtToTop"); } public void partClosed(IWorkbenchPart part) { System.out.println("partClosed"); } public void partDeactivated(IWorkbenchPart part) { System.out.println("partDeactivated"); } public void partOpened(IWorkbenchPart part) { System.out.println("partOpened"); } }); }
Gruss 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
-
Hallo,
danke an dich Thomas für deinen Tipp!
Mein Problem etwas konkreter:
In der View ist ein TreeViewer, dessen ContentProvider per Listener benachrichtigt wird,
wenn sich Ressourcen im Workspace ändern. Dieser sollte aber nur benachrichtigt werden, wenn die View wirklich sichtbar ist(also nicht geschlossen wurde).
Deine Lösung mit dem PartListener hörte sich auch echt recht gut an:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
public void partDeactivated(IWorkbenchPart part) { IViewPart fbStudioView = getViewSite().getWorkbenchWindow().getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID); if ((part instanceof FBStudioView) && !getViewSite().getWorkbenchWindow().getActivePage().isPartVisible(part)) { TreeViewer treeViewer = ((FBStudioView)part).getViewer(); try { System.err.println("Listener removed!"); ResourcesPlugin.getWorkspace().removeResourceChangeListener((FBStudioContentProvider)treeViewer.getContentProvider()); } catch (Exception e) { System.out.println("FBStudioView#createPartControl(...): ResourceChangeListener already be removed!"); } } }
Nur ist die View zum Zeitpunkt, wenn ich mit isPartVisible abfrage noch sichtbar.
Aber dieser Part sollte doch schon deactivated sein, oder
Ein anderer Lösungweg war eine Modifikation der resourceChanged() Methode im ContentProvider:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public void resourceChanged(IResourceChangeEvent event) { IViewPart dcbStudioView = null; IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows(); for (int i=0;i<windows.length;i++) { IWorkbenchWindow window = windows[i]; dcbStudioView = window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID); if (dcbStudioView != null) { boolean isVisible = window.getActivePage().isPartVisible(window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID)); if (isVisible) { processDelta(event.getDelta()); } } } }
Dies löst aber in der Zeile
Code :1
window.getActivePage().isPartVisible(window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID));
eine SWT Exception [org.eclipse.swt.SWTException: Invalid thread access] aus. Aber warum, wie wechsle ich den Thread, damit das nicht passiert?
Gruß,
Crai
-
22.02.06 14:06 #4
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Kann leider jetzt nicht danach schauen, aber du koenntest duese Anweisung auch innerhab eines
eine SWT Exception [org.eclipse.swt.SWTException: Invalid thread access] aus. Aber warum, wie wechsle ich den Thread, damit das nicht passiert?
Code-Blocks ausfuehren.Code :1 2 3 4 5
Display.getCurrent().asyncExec(new Runnable(){ public void run() { // TODO your code... } });
Aber weshalb musst du denn nochmal die passende View suchen? Bist du denn dort nicht innerhalb der View?
Gruss 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
-
Vielen Dank Thomas,
mit dem Display.asyncExec.... klappts!
Ich bin in meinem ContentProvider, nicht in meiner View.
Gruß,
Crai
Ähnliche Themen
-
Welchen Listener brauche ich um auf das selektieren einer Table-Row zu reagieren.
Von Hubivan im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 9Letzter Beitrag: 20.07.08, 14:58 -
Wie kann man diese Edit View aufbauen?
Von jonlee im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 05.07.08, 18:30 -
Wie kann man per Button eine neue View anzeigen
Von maxpower24 im Forum C/C++Antworten: 1Letzter Beitrag: 14.12.05, 09:21 -
Reagieren auf Schließen des IE Browserfensters möglich?
Von mzuelch im Forum Javascript & AjaxAntworten: 3Letzter Beitrag: 21.01.05, 14:50 -
Abfangen von WM_Close und reagieren in einer Callbackfunktion mit DLL
Von Chrissinger im Forum C/C++Antworten: 6Letzter Beitrag: 08.07.04, 12:45





Zitieren

Login





