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);