Aktualisierrung in regelmäßigen Abständen

schuetzejanett

Erfahrenes Mitglied
Hallo,

ich habe eine RCP in der mehrere Views ähnlich wie karteikarten angeordnet sind. Die eine View simuliert di ewarteschlage des druckers.
Nun möchte ich das solange die View den Focus hat sie sich ständig aktualisiert, und auch dann wenn sie den focus erhält hat eine andere view den focus soll sie sich nicht aktualisieren (oder sie muss es nicht). Die Methode fürs aktuaisieren habe ich schon, nur weiß ich nicht so recht wie ich den rest machealso das sie sich nur aktualisiert, wenn sie den focus hat oder bekommt und das dann in regelmäßigen abständen jede halbe minute oder so.

Kann mir jemand sagen, wie ich dies realisieren kann?
 
Benutze die Events um rauszufinden ob dein View den Fokus hat und leg dir das in nem boolean Flag ab. Dann benutzt du einen Timer welcher alle x Sekunden dann einen TimerTask ausfuehrt welcher prueft ob das flag true ist und dann deine Methode aufruft.
 
Hallo,

also wollte es jetzt so versuchen das ich einen focuslistener verwende. In der focusGained methode setze ich das flag dann auf true und habe eine while schleife ldie äuft solange das flag auf true ist. in der while schleife ist dann das runnable welches die aktualisierung ausführt und einthread sleep(30000) um die zeit zu überbrücken) in der focuslost methode wird schließlich das flag false gesetzt.

Habe diesen lisener erst dem view zzugeodnet und dann dem hauptparent auf dem alle controls liegen. doch keiner reagiert, wenn ide view den focus kriegt. Was mache ich falsch.
Und ist mein weg an sich richtig. Du verwendest ihn ja in ähnlicher hinsicht, was müsst eich ändern um dein verfahren zu verwenden.

Hier mal mein code

Variante1: bei der view:
Java:
public ViewPrinterState() 
   { 
      super(); 
      this.addListenerObject(new FocusListener() 
      { 

         @Override 
         public void focusGained(FocusEvent e) 
         { 
            hasFocus = true; 
            System.out.println("habe jetzt focus"); 
            while (hasFocus) 
            { 
               new Runnable() 
               { 
                  public void run() 
                  { 
                     IWorkbenchWindow window = PlatformUI.getWorkbench() 
                           .getActiveWorkbenchWindow(); 
                     new ActionPrinterRefresh(window).run(); 
                     System.out.println("bin noch da: " + new Date()); 
                  } 
               }; 
               try 
               { 
                  Thread.sleep(1000); 
               } catch (InterruptedException e1) 
               { 
               } 
            } 
         } 

         @Override 
         public void focusLost(FocusEvent e) 
         { 
            hasFocus = false; 
            System.out.println("bin nicht mehr da : " + new Date()); 
         } 

      }); 
   }

Variante 2: beim parent composite
Java:
public void createPartControl(Composite parentOld) 
   { 
      this.parent = parentOld; 
      parent.setSize(800, 800); 

      parent.addFocusListener(new FocusListener() 
      { 
         @Override 
         public void focusGained(FocusEvent e) 
         { 
            hasFocus = true; 
            System.out.println("habe jetzt focus"); 
            while (hasFocus) 
            { 
               new Runnable() 
               { 
                  public void run() 
                  { 
                     IWorkbenchWindow window = PlatformUI.getWorkbench() 
                           .getActiveWorkbenchWindow(); 
                     new ActionPrinterRefresh(window).run(); 
                     System.out.println("bin noch da: " + new Date()); 
                  } 
               }; 
               try 
               { 
                  Thread.sleep(1000); 
               } catch (InterruptedException e1) 
               { 
               } 
            } 
         } 

         @Override 
         public void focusLost(FocusEvent e) 
         { 
            hasFocus = false; 
            System.out.println("bin nicht mehr da : " + new Date()); 
         } 

      });

Siehst du einen fehler, oder warum reagiert keiner der listener?
 
Zuletzt bearbeitet von einem Moderator:
Oder muss ich den focuslistener irgendwo anders setzen? Dachte halt wenn ich es im konstruktor mache geht es, und was mich nohmehr wundert ist wieso auch der andere we also der auf ein composite nicht geht. Könnte es noch mit der tabelle versuchen allerdings habe ich auch noch eine toolbar und wenn diese angeklickt ist, soll das ganze ja auch noch funktionieren.

Keiner ne idee?
 
Versuch es mal den Listener wirklich auf eine Top-Level Komponente zu setzen und schau ob du da irgendwo ein Event herbekommst.
 
Hallo also parent ist ja die top-level komponente. also in der createPartControl(Composite parentOld) indem ich sage parent = parentOld und demw eiße ich dann den focuslistener zu allerdings reagiert der überhaupt nicht weil ja nicht mal meine testausgaben ausgegeben werden.
und die view diekr hat nur addPartpropertylistener() und addprobertyLiustener und die von mir verwendeteMethode addlistenerObjeck. allerdings kann ich den ersten beiden nicht mit new Focuslistener den focuslistener zuordnen.

jetzt steh ich total auf dem schlauch wie bekomme ich denn bloß mit das die view den focus hat?
 
Du hast doch irgendwas von Tabelle gesprochen. Ich meine wirkliche die Komponente die ganz oben drauf ist wenn man raufschaut.
 
ja also die toplevelcomponente ist das composite parent darauf befinden sich ein composiute in dem eine toolbar ist und eine in der die tabelle ist. Diese wird in der aktualisieren methode aktualisiert. alles andere ist ja statisch. und auf die parent komponente setze ich den focuslistener aber die focus gained methode reagiert nicht.
 
Also das mit dem Focus habe ich jetzt hinbekommen. man muss in dem ApplicationWorkbenchWindowKlasse eine Listener adden und da hat man dan das viewActivate und deactivate wo ich testen kann ob das die View welche aktualisiert werden soll ist. Wollte das jetzt so lösen das ich bei getFocus eine Instanzveriable hasFocus mit true belege und eine Aktualisierfunktion aufrufe, welche aller 10 sek oder halbe Minute oder so guckt ob die View noch den Focus hat und dann die Aktualisierung ausführt, aber irgendwas mache ich dabei falsch denn mein Programm ist während der Aktion nicht mehr steuerbar.
Meine aktualisierung funktioniert so, das ich eine RefreshAction aufrufe und starte, diese aktualsiert das model und da die view ja beim Model als Beobachter angemeldet ist wird die view aktualsiert. Aber das ist halt nur der Wunsch, denn wie gesagt. es geht nicht. Poste heute abend auch noch ein bischen Code. Freue mich aber in der Zwischenzeit über tipps zum lösen oder vermustungen nach Fehlern
 
Zurück