3.13.1. Farben unter SWT

Unter SWT werden für Farben Systemresourcen verwendet. Diese werden mit Hilfe des SWT Display erzeugt, und sollten disposed werden, sobald man sie nicht mehr benötigt.

Für ein ColorValue wird erst dann eine Systemresource erzeugt, wenn sie tatsächlich benutzt wird und wenn die gleiche Farbe nicht bereits existiert. Dazu wird ein Color Cache verwendet, welcher für ColorValue Keys SWT Farben liefert. Um für ein ColorValue Objekt eine gecachte SWT Farbe aus dem Cache zu entfernen und anschließend zu disposen, kann man auf dem ColorValue Objekt die Methode

    void release();

aufgerufen werden. Dies ist aber nur dann wirklich sinnvoll, wenn viele unterschiedliche Farben angelegt werden, welche man später nicht mehr benötigt, wie zum Beispiel für einen Color Chooser.

Die Farben der weiter vorne beschriebenen Klasse Colors nach deren Verwendung wieder zu releasen ist zwar möglich, bringt aber nicht wirklich eine nennenswerte Speichereinsparung (alle 13 Farben benötigen zusammen grob überschlagen 130 Byte).

Das folgende Beispiel zeigt eine Animation bei der 32768 unterschiedliche Farben verwendet werden. Diese würden ca. 320 kByte benötigen, weshalb sie direkt nach deren Verwendung wieder aus dem Cache released werden (Zeile 19):

  1      final IAnimationRunner animationRunner = AnimationRunner.create();
  2      animationRunner.setDelay(20, TimeUnit.MILLISECONDS);
  3  
  4      final Runnable animationStep = new Runnable() {
  5  
  6          private int red = 0;
  7          private int redIncrement = 1;
  8  
  9          private int green = 0;
 10          private int greenIncrement = 2;
 11  
 12          private int blue = 0;
 13          private int blueIncrement = 3;
 14  
 15          @Override
 16          public void run() {
 17              final ColorValue color = new ColorValue(red, green, blue);
 18              frame.setBackgroundColor(color);
 19              color.release();
 20  
 21              red = red + redIncrement;
 22              if (red >= 255) {
 23                  red = 255;
 24                  redIncrement = redIncrement * -1;
 25              }
 26              else if (red <= 0) {
 27                  red = 0;
 28                  redIncrement = redIncrement * -1;
 29              }
 30  
 31              green = green + greenIncrement;
 32              if (green >= 255) {
 33                  green = 255;
 34                  greenIncrement = greenIncrement * -1;
 35              }
 36              else if (green <= 0) {
 37                  green = 0;
 38                  greenIncrement = greenIncrement * -1;
 39              }
 40  
 41              blue = blue + blueIncrement;
 42              if (blue >= 255) {
 43                  blue = 255;
 44                  blueIncrement = blueIncrement * -1;
 45              }
 46              else if (blue <= 0) {
 47                  blue = 0;
 48                  blueIncrement = blueIncrement * -1;
 49              }
 50  
 51              animationRunner.run(this);
 52          }
 53      };
 54  
 55      animationRunner.start();
 56      animationRunner.run(animationStep);

Siehe auch PDF Version dieses Dokuments, Jowidgets API Spezifikation