Grafik

SWT stellt eine Grafiksteuerkomponente zur Verfügung, mit der in Fensterobjekten Grafik dargestellt werden kann und Images angezeigt werden können. Hierdurch ist es häufig nicht einmal erforderlich, eine Programmierung für die Grafikschnittstelle vorzunehmen, da die Fensterobjekte das Ausfüllen von Symbolen, Text und anderer Daten für Sie übernehmen. Wenn Ihre Anwendung angepasste Grafik verwendet oder Sie ein angepasstes Zeichnungsfensterobjekt implementieren, müssen Sie jedoch einige Grundlagen über Zeichnungsobjekte in SWT kennen.

Grafikkontext

Der Grafikkontext GC ist der zentrale Punkt für die Grafikunterstützung von SWT. Seine API beschreibt alle Zeichnungsfunktionen in SWT.

Ein GC kann für das Zeichnen auf einem Steuerelement (dies ist der häufigste Fall), auf einem Image, in einer Anzeige oder auf einem Drucker verwendet werden. Beim Zeichnen auf einem Steuerelement müssen Sie den GC verwenden, der Ihnen im Zeichnungsereignis des Steuerelements zur Verfügung gestellt wird. Beim Zeichnen auf einem Image, in einer Anzeige oder auf einem Drucker müssen Sie einen entsprechend konfigurierten GC erstellen und den GC nach seiner Verwendung wieder entfernen.

Sobald der GC vorliegt, können Sie seine Attribute (z. B. Farbe, Zeilenlänge und Schriftart) festlegen, die die Darstellung der Grafik steuern, die im GC gezeichnet wird.

Die API-Referenz zu GCbeschreibt die vollständige Palette der Grafikfunktionen.

Schriftarten

Die Klassen Font und FontData werden verwendet, wenn Schriftarten in SWT bearbeitet werden.

FontData beschreibt die Kenndaten einer Schriftart. Sie können eine Klasse 'FontData' erstellen, indem Sie einen Schriftartnamen, eine Darstellung und die Größe angeben. Die Klasse 'FontData' enthält eine API zum Abfragen dieser Attribute. Da 'FontData' keinen Betriebssystemressourcen zugeordnet wird, müssen Sie diese Klasse nach ihrer Verwendung nicht entfernen.

Die Klasse 'Font' ist das eigentliche Grafikobjekt, das eine in der Zeichnungs-API verwendete Schriftart darstellt. Eine Klasse 'Font' erstellen Sie für ein Objekt Display, indem Sie 'Display' und 'FontData' für die gewünschte Schriftart angeben. Sie können eine Klasse 'Font' auch nach ihrem Wert für 'Fontdata' abfragen.

Eine zugeordnete Klasse 'Font' muss entfernt werden, wenn sie nicht mehr verwendet wird.

Farben

Farben haben Ähnlichkeit mit Schriftarten. Sie erstellen eine Klasse Color für ein Objekt Display, indem Sie die RGB-Werte der gewünschten Farbe angeben. Eine zugeordnete Farbe muss entfernt werden, wenn sie nicht mehr verwendet wird.

Mit der Methode getSystemColor(int)für ein Objekt 'Display' können Sie die vordefinierten Systemfarben für die Betriebssystemplattform abfragen. Farben, die mit dieser Methode abgerufen werden, sollten nicht entfernt werden.

Das Farbmodell wird unter SWT color model ausführlich erläutert.

Images

Die Klassen Image, ImageData und ImageLoader werden bei der Bearbeitung von Images in SWT verwendet.

Die Klasse 'ImageData' beschreibt die tatsächlichen Pixel im Image und verwendet die Klasse PaletteData, um die verwendeten Farbwerte zu beschreiben. ImageData ist eine einheiten- und plattformunabhängige Beschreibung eines Images.

'ImageLoader' lädt und speichern Klassen 'ImageData' in unterschiedlichen Dateiformaten. Gegenwärtig unterstützt SWT das Laden und Speichern der Image-Formate BMP (Windows-Bitmap), ICO (Windows-Symbol), JPEG, GIF und PNG.

Die Klasse 'Image' ist das eigentliche Grafikobjekt, das eine in der Zeichnungs-API verwendete Grafik darstellt. Sie erstellen ein Image für ein bestimmtes Objekt 'Display'. Images können auf unterschiedlichen Wegen erstellt werden:

Unabhängig davon, wie Sie die Klasse 'Image' erstellt haben, müssen Sie immer dafür sorgen, dass sie entfernt wird.

Lebenszyklus von Grafikobjekten

Die meisten Grafikobjekte, die beim Zeichnen in SWT verwendet werden, ordnen Ressourcen im zu Grunde liegenden Betriebssystem zu und müssen explizit entfernt werden. Die bereits an früherer Stelle erläuterte Regel gilt auch in diesem Fall. Falls Sie zur Erstellung einen Konstruktor verwendet haben, müssen Sie das Objekt entfernen. Haben Sie auf andere Weise auf das Objekt zugegriffen, muss es nicht entfernt werden.

Erstellen

Grafikobjekte wie beispielsweise Grafikkontext, Schriftarten, Farben und Images werden im Betriebssystem zugeordnet, sobald das Objekt erstellt wird. Die beabsichtigte Verwendung der Grafikobjekte bestimmt demnach, wann diese erstellt werden sollten.

Grafikobjekte, die in einer Anwendung intensiv eingesetzt werden, können Sie zu dem Zeitpunkt erstellen, an dem Sie die Fensterobjekte erstellen. Dies erfolgt in der Regel bei Farben und Schriftarten. In anderen Fällen ist es besser, wenn die Grafikobjekte während der Verarbeitung erstellt werden. Sie können beispielsweise einen Grafikkontext in einer der Ereignissteuerroutinen für das Fensterobjekt erstellen, um bestimmte Berechnungen auszuführen.

Wenn Sie ein angepasstes Fensterobjekt implementieren, ordnen Sie normalerweise Grafikobjekte im Konstruktor zu, falls Sie diese immer verwenden. Sie könnten diese während der Verarbeitung zuordnen, wenn sie nicht ständig verwendet werden oder von dem Status eines bestimmten Attributs abhängig sind.

Ausfüllen

Nachdem Sie die Grafikobjekte zugeordnet haben, können Sie mit dem Ausfüllen beginnen. Das Ausfüllen sollten Sie immer in einer entsprechenden Listener-Funktion vornehmen. Es gibt seltene Fälle, insbesondere bei der Implementierung von angepassten Fensterobjekten, in denen Sie das Ausfüllen vornehmen, während sie auf ein anderes Ereignis reagieren. Hiervon wird jedoch generell abgeraten. Wenn Sie glauben, das Ausfüllen während der Verarbeitung eines anderen Ereignisses vornehmen zu müssen, sollten Sie zunächst versuchen, die Methode redraw zu verwenden, die ein weiteres Ausfüllereignis im Betriebssystem generiert. Das Ausfüllen außerhalb der Methode "paint" beeinträchtigt Plattformoptimierungen und kann Programmfehler verursachen, wenn die Ereigniswarteschlange eine entsprechende Anzahl von anstehenden Ausfüllereignissen enthält.

Wenn Sie ein Ausfüllereignis empfangen, wird ein vorkonfigurierter GC für das Zeichnen im Fensterobjekt zur Verfügung gestellt. Dieser GC darf nicht entfernt werden! Dies liegt daran, dass Sie ihn nicht selbst erstellt haben.

Alle anderen Grafikobjekte müssen während der Verarbeitung des Ereignisses (oder im voraus) zugeordnet werden. Der folgende Ausschnitt basiert auf dem Beispiel org.eclipse.swt.examples.HelloWorld5. Die Farbe Rot wurde während der Erstellung des Fensterobjekts bereits zugeordnet und kann daher hier verwendet werden.

   shell.addPaintListener(new PaintListener () {
      public void paintControl(PaintEvent event){
         GC gc = event.gc;
         gc.setForeground(red);
         Rectangle rect = event.widget.getClientArea();
         gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
         gc.drawString (resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);
      }
   });

Entfernen

Alle von Ihnen zugeordneten Grafikobjekte müssen nach ihrer Verwendung entfernt werden.

Der Zeitpunkt des Entfernens ist davon abhängig, wann Sie das Objekt erstellt haben. Wird ein Grafikobjekt im Rahmen der Erstellung eines Fensterobjekts erstellt, sollten Sie generell eine Listener-Funktion für das Entfernen im Fensterobjekt hinzufügen und das Grafikobjekt entfernen, wenn das Fensterobjekt entfernt wird. Falls Sie ein Objekte während der Verarbeitung des Ausfüllens erstellen, sollten Sie es entfernen, sobald das Ausfüllen beendet ist.

Der nächste Codeausschnitt zeigt eine leicht abgewandelte Version der Listener-Funktion für das Ausfüllen. In diesem Beispiel wird die Farbe Rot während des Ausfüllens zugeordnet und entfernt.

   shell.addPaintListener(new PaintListener () {
      public void paintControl(PaintEvent event){
         GC gc = event.gc;
         Color red = new Color(event.widget.getDisplay(), 0xFF, 0, 0);
         gc.setForeground(red);
         Rectangle rect = event.widget.getClientArea();
         gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);
         gc.drawString (resHello.getString ("Hello_world"), rect.x + 20, rect.y + 20);
         red.dispose();
      }
   });