SWT Tray

Matze82

Mitglied
Hallo,

hab mal ne Frage zum Tray in Java.
Das Tray Icon soll animiert dargestellt werden (z.B. wie bei ICQ), gibt es dafür eine einfache Lösung?
Man kann ja 2 oder mehrere Icons nehmen und die wechseln lassen, aber das muss ja in einem extra Thread passieren was die Applikation an sich wieder bremst und nicht benutzbar macht.
Hab keine Idee, wie man das realisieren könnte...

Schonmal danke für die Hilfe...

MFG
 
Habe einen extra Thread gestartet der immer das icon wechselt und dazwischen ein Thread.sleep(1000) und dadurch steht die App immer wieder...
 
Ein extra Thread ist doch dazu da um die Applikation nicht auszubremsen! Einen Thread zu erzeugen und dem die Aufgabe zu geben alle 100ms ein neues Image anzuzeigen ist doch keine Belastung für einen heutigen Computer(außer für den C64 :)) Man bedenke das das Image gerade mahl 16*16 Pixel sein kann. Wenn du Images hast die 1024*1024 groß sind und diese nun jedesmal runtergerechnet werden müssen ist das kontraproduktiv für das System. Ich hoffe das deine Frage damit beantwortet ist und du nun einen Thread einbaust.
 
Das mit dem extra thread hatte ich doch schon eingebaut, und da hing ja meine app immer...:mad:

zur erklärung, habe meine form und eine methode changeTrayIcon:
Code:
 _Display.asyncExec(new Runnable() {
                public void run() {
                    if (_TrayItem.isDisposed()) return;
                    _TrayItem.setImage(Image);  
                }
            });

das geht ohne Probleme, da wird das Icon geändert und gut, wenn ich das nun aber animieren möchte, dann muss ich das ja ändern.
dachte ich starten nen neuen thread mit ner while schleife, wo die verschiedenen images im sekunden takt eingeblendet werden. das funktioniert aber nicht so wie ich dachte.
Code:
Thread t = new Thread(new BlinkTray());
t.start();

class BlinkTray implements Runnable {
   public void run() {
      while(true){
         for(int i=0; i<Images.length; i++) {
             _Display.asyncExec(new Runnable() {
                public void run() {
                    if (_TrayItem.isDisposed()) return;
                    _TrayItem.setImage(Image[i]);  
                }
            });
         }
      }
   }
}

Lieg ich da so falsch
 
1. Code-Tags benutzen bitte

2. Du erstellst also einen Thread BlinkTray, der widerum mit asyncExec jedesmal einen neuen Thread erstellt und nirgends wird gewartet, deine while-Schleife erstellt also so schnell wie möglich den nächsten Thread, ohne irgendwann kurz zu warten.

Versuch's mal so:

Code:
Thread t = new Thread(new BlinkTray());
t.start();

class BlinkTray implements Runnable {
  public void run() {
    while(true){
      for(int i=0; i<Images.length; i++) {      
        if (_TrayItem.isDisposed()) return;
        _TrayItem.setImage(Image[i]);
      }
      this.wait(100);
    }
  }
}
 
@procurve asyncExec ist in SWT erforderlich. Die GUI kann nur im GUI-Thread aktualisiert werden und nicht aus Fremdthreads.

Aber nen sleep solltest du auf jeden Fall mal einbauen Matze82. Ansonsten benutze einen Timer + TimerTask den du entsprechend laufen lässt.
 
Hallo,
probier mal sowas hier.
Du musst nur noch die Bilder in den Thread bekommen.

Gruß

Code:
new BlinkTray(display, item).start();


class BlinkTray extends Thread {
  private Display display;
  private TrayItem item;

  public BlinkTray(Display display, TrayItem item) {
    this.display = display;
    this.item = item;
  }

  public void run() {
	while(true){
	    for (int i = 0; i < Images.length; i++) {
	      try {
	        Thread.sleep(1000);
	      } catch (InterruptedException e) {
	      }
	      display.asyncExec(new Runnable() {
	        public void run() {
	          if (item.isDisposed())
	            return;
	          item.setImage(Image[i]);
	        }
	      });
	    }
	}
  }
}
 
Zuletzt bearbeitet:
Zurück