Das Zeichnen von Text ist mit drei Java-Klassen einfach

Zusätzlich zu Methoden zum Zeichnen primitiver geometrischer Typen wie Linien und Kreise bietet die GraphicsKlasse Methoden zum Zeichnen von Text. Wenn sie mit der kombiniert Fontund FontMetricsKlassen, ist das Ergebnis eine Reihe von Tools, die die Arbeit der Erstellung ansprechender Text macht viel einfacher , als es sonst sein könnte. Diese Spalte behandelt nacheinander jede dieser Klassen und zeigt Ihnen, wie Sie sie zusammen verwenden können. Bevor ich jedoch anfange, ist ein kurzer Überblick über die Rolle der GraphicsKlasse angebracht.

Eine Rezension

Um die Textmethoden der GraphicsKlasse verwenden zu können, ist ein Verständnis der Rolle der GraphicsKlasse selbst erforderlich. Dieser Abschnitt bietet einen kurzen Überblick über die Funktion und Funktionsweise der GraphicsKlasse. Leser, die eine gründliche Berichterstattung wünschen, sollten meine Oktober-Kolumne lesen, die hier verfügbar ist.

Die GraphicsKlasse spielt innerhalb des Abstract Winding Toolkit (AWT) zwei verschiedene, aber verwandte Rollen. Erstens wird der Grafikkontext beibehalten, der aus allen Informationen besteht, die sich auf das Ergebnis einer Grafikoperation auswirken. Dies umfasst die Zeichenfarbe, die Schriftart sowie die Position und Abmessungen des Schnittrechtecks ​​(der Bereich, in dem Grafiken gezeichnet werden können). Noch wichtiger ist, dass der Grafikkontext das Ziel für die zu diskutierenden Grafikoperationen definiert (Ziele umfassen Komponenten und Bilder).

Zusätzlich zu ihrer Rolle als Grafikkontext bietet die GraphicsKlasse Methoden zum Zeichnen einfacher geometrischer Formen, Texte und Bilder zum Grafikziel. Alle grafischen Operationen an einer Komponente oder einem Bild erfolgen über eine dieser Methoden.

Zum Zeichnen benötigt ein Programm einen gültigen Grafikkontext (dargestellt durch eine Instanz der GraphicsKlasse). Da die GraphicsKlasse eine abstrakte Basisklasse ist, kann sie nicht direkt instanziiert werden. Eine Instanz wird normalerweise von einer Komponente erstellt und dann als Argument für die Komponenten update()und paint()Methoden an das Programm übergeben . Diese beiden Methoden werden als Teil des normalen Zeichenzyklus aufgerufen, der innerhalb der AWT eingeleitet wird.

Die GraphicsKlasse arbeitet mit den Klassen Fontund zusammen FontMetrics, um die Werkzeuge bereitzustellen, die zum Zeichnen von Text in einem Bild oder einer Komponente erforderlich sind. Beginnen wir mit der Untersuchung der GraphicsMethoden der Klasse zum Zeichnen von Text.

Klassengrafiken

Die GraphicsKlasse bietet drei Methoden zum Zeichnen von Text auf einer Komponente oder einem Bild.

void drawString (String str, int x, int y)

Die drawString()unten gezeigte Methode verwendet als Parameter eine Instanz der StringKlasse, die den zu zeichnenden Text enthält, und zwei ganzzahlige Werte, die die Koordinaten angeben, an denen der Text beginnen soll.

public void paint (Grafik g) {g.drawString ("abc", 25, 25); }}

Der Code in der obigen Liste zeigt die drawString()Methode, die in der Methode einer Komponente paint()verwendet wird. Der Code in diesem Beispiel zeichnet das Wort "abc" auf die Komponente, die diese paint()Methode enthält. Die x- und y- Koordinaten geben die Position der unteren linken Ecke des umschließenden Textfelds an. Abbildung 1 zeigt, wie das Ergebnis aussehen würde, wenn dieser Code Teil eines geeigneten AWT-Komponentenobjekts wäre.

Abbildung 1: Eine drawString () - Demonstration

void drawChars (char [] Daten, int Offset, int Länge, int x, int y)

Die folgende drawChars()Methode verwendet als Parameter ein Zeichenarray, das den zu zeichnenden Text enthält, einen ganzzahligen Wert, der den Versatz in das Array angibt, bei dem begonnen werden soll, einen ganzzahligen Wert, der die Anzahl der zu zeichnenden Zeichen angibt, und zwei ganzzahlige Werte, die die Koordinaten angeben, in denen die Text sollte beginnen.

public void paint (Grafik g) {char [] rgc = {'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'j'};

g.drawChars (rgc, 0, 5, 25, 25); g.drawChars (rgc, 5, 5, 25, 50); }}

Der obige Code zeigt die drawChars()Methode, die in der Methode einer Komponente paint()verwendet wird. Das Zeichenarray besteht aus zwei Teilen. Im ersten der beiden Anrufe drawChars(), die Offset zeigen Parameter , dass die Zeichnung mit dem ersten Zeichen in dem Array beginnen sollte, und die Länge Parameter geben an, dass insgesamt fünf Zeichen sollte in der ersten Zeile gezogen werden. Der zweite der beiden Aufrufe funktioniert auf ähnliche Weise, zeichnet jedoch die letzten fünf Zeichen im Zeichenarray, beginnend an einer Position 25 Pixel unter dem ersten. Abbildung 2 zeigt, wie das Ergebnis aussehen würde, wenn dieser Code Teil eines geeigneten AWT-Komponentenobjekts wäre.

Abbildung 2: Eine Demonstration von drawChars ()

void drawBytes (Byte [] Daten, int Offset, int Länge, int x, int y)

Wie unten gezeigt, verwendet das drawBytes()Verfahren als Parameter ein Byte-Array, das den zu zeichnenden Text enthält, einen ganzzahligen Wert, der den Versatz in das Array angibt, bei dem begonnen werden soll, einen ganzzahligen Wert, der die Anzahl der zu zeichnenden Bytes angibt, und zwei ganzzahlige Werte, die den angeben Koordinaten, wo der Text beginnen soll.

public void paint (Grafik g) {byte [] rgb = {'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'};

g.drawBytes (rgb, 0, 5, 25, 25); g.drawBytes (rgb, 5, 5, 25, 50); }}

Der obige Code zeigt die drawBytes()Methode, die in der Methode einer Komponente paint()verwendet wird. Abbildung 3 zeigt, wie das Ergebnis aussehen würde, wenn dieser Code Teil eines geeigneten AWT-Komponentenobjekts wäre.

Abbildung 3: Eine drawBytes () - Demonstration

Unicode-Unterstützung

Eine der am meisten angepriesenen Funktionen von Java ist die Unterstützung internationaler Skripte über Unicode. Es ist bedauerlich, dass die mit Version 1.0 der Java-Programmiersprache gelieferte Java-Klassenbibliothek diese Facette der Sprache nicht vollständig unterstützt hat. Es scheint jedoch, dass gute Nachrichten gleich um die Ecke sind. Die vorläufige Internationalisierungs-API (siehe Ressourcen), die von SunSoft erhältlich ist, hat Folgendes zu sagen:

JDK 1.0 beschränkte sich darauf, nur die Zeichen in der Latin-1-Teilmenge von Unicode anzuzeigen. Diese Einschränkung wurde in JDK 1.1 entfernt. Java-Programme können jetzt alle Unicode-Zeichen anzeigen, die mit einer Host-Schriftart gerendert werden können. Java bietet eine kleine Anzahl vordefinierter "virtueller" Schriftnamen und ordnet sie realen Schriftarten zu, die auf dem Host verfügbar sind. In JDK 1.0 wurde jeder Java-Schriftartname genau einer Host-Schriftart zugeordnet. In JDK 1.1 kann ein Java-Schriftname einer Reihe von Host-Schriftarten zugeordnet werden. Die Reihe der Host-Schriftarten kann so ausgewählt werden, dass sie den gewünschten Unicode-Zeichensatz abdecken.

Textplatzierung

Da Text für AWT nur eine andere Art von Figur ist, kann eine Textzeile überall platziert werden - sogar über einer anderen Textzeile. Die Auswirkung einer zufälligen Platzierung wird jedoch für das Auge nicht unbedingt angenehm sein. Um den Programmierer bei der Erstellung von ästhetisch ansprechendem Text zu unterstützen, enthält eine Schriftdefinition Richtlinien für die Platzierung von Zeilen und Zeichen. Wenn diese Richtlinien befolgt werden, können Sie eine ansprechende Ausgabe erzielen.

Abbildung 4 enthält eine Textzeile, die markiert wurde, um die Merkmale anzugeben, die wir diskutieren werden.

Abbildung 4: Eine Textzeile

Der Parameter y- Koordinate in den Methoden im vorherigen Abschnitt gibt die Position der Grundlinie einer Textzeile an. Die Grundlinie ist die Zeile, auf der die meisten Zeichen in einer Textzeile ruhen (mit Ausnahme der Zeichen mit Nachkommen wie "g" und "y"). Die Grundlinie ist nicht wirklich ein Merkmal einer Schriftart, sondern der Bezugspunkt, auf den sich alle anderen Merkmale beziehen.

Der Aufstieg ist der Abstand von der Grundlinie bis zum oberen Rand der meisten Zeichen in einer Schriftart. Dies ist normalerweise die Höhe der Großbuchstaben in der Schriftart und der Zeichen wie "f" und "h". Diese Zahl ist jedoch nur eine Richtlinie. Einige Zeichen in der Schriftart können sich tatsächlich über diesen Abstand erstrecken.

Der Abstieg ist der Abstand von der Grundlinie zum unteren Rand der Zeichen in einer Schriftart mit Nachkomma - Zeichen wie "p", "g" und "y". Wie beim Aufstieg ist diese Zahl nur eine Richtlinie. Einige Zeichen in der Schriftart können sich tatsächlich unterhalb dieses Abstands erstrecken.

Das führende (ausgesprochen "ledding") ist der Abstand zwischen dem Abstieg einer Textzeile und dem Aufstieg der darunter liegenden Zeile. Die Höhe einer Textzeile (der Abstand zwischen der Grundlinie einer Textzeile und der Grundlinie einer Textzeile darüber oder darunter) enthält diesen zusätzlichen Platz.

Zusätzlich zu den Merkmalen, die eine Schriftart als Ganzes bestimmen, hat jedes Zeichen in einer Schriftart einen Fortschritt . Der Fortschritt gibt an, wie viele Pixel den Anfang des Zeichens vom Anfang eines Zeichens rechts davon trennen. Kurz gesagt, es ist die Breite eines Zeichens. Wiederum können einige Zeichen in einer Schriftart tatsächlich über diesen Abstand hinausgehen.

Durch Addieren der Breite aller Zeichen in einer Textzeile kann die Länge der gesamten Textzeile berechnet werden. Die folgende FontMetricsKlasse bietet eine Methode, die genau dies und mehr tut.

Klasse FontMetrics

Die FontMetricsKlasse bietet eine einfache Möglichkeit, zu den oben beschriebenen Merkmalen zu gelangen. Hier ist die getFontMetricsMethode in Aktion:

public void paint (Grafik g) {FontMetrics fm = g.getFontMetrics (); . . . }}

Der obige Code zeigt, wie Informationen zu Schriftmetriken, die die aktuelle Schrift beschreiben, abgerufen werden können. Die getFontMetrics()Methode gibt eine Instanz der FontMetricsKlasse zurück. Die FontMetricsKlasse bietet die folgenden Methoden:

int getAscent()

  • Gibt den Aufstieg der Schrift zurück.

int getDescent()

  • Gibt den Abstieg der Schrift zurück.

int getLeading()

  • Gibt den Zeilenabstand der Schrift zurück.

int getHeight()

  • Gibt die Höhe der Schrift zurück. Die Höhe ist die Summe aus Aufstieg, Abstieg und Führung der Schrift.

int charWidth(int ch)

  • Gibt die Breite des angegebenen Zeichens zurück.

int charWidth(char ch)

  • Gibt die Breite des angegebenen Zeichens zurück.

int [] getWidths()

  • Gibt ein ganzzahliges Array zurück, das die Breite der ersten 256 Zeichen der Schriftart enthält.

Wie oben erwähnt, können die Zeichen, aus denen eine Schriftart besteht, manchmal über den Aufstieg, den Abstieg und die Breite hinausgehen, die mit den oben beschriebenen Methoden angegeben wurden. In Fällen, in denen genaue Werte erforderlich sind, werden die folgenden Methoden bereitgestellt.

int getMaxAscent()

  • Gibt den maximalen Aufstieg der Schrift zurück.

int getMaxDescent()

  • Gibt den maximalen Abstieg der Schrift zurück.

int getMaxAdvance()

  • Gibt die Breite des breitesten Zeichens in der Schrift zurück.

Die folgenden Methoden geben Auskunft über die Breite einer Zeichenfolge.

int stringWidth(String str)

  • Gibt die Breite der Zeichenfolge zurück.

int bytesWidth(byte [] rgb, int offset, int length)

  • Gibt die Breite der Länge einer langen Folge von Bytes zurück, die beim Versatz beginnen .

int charsWidth(char [] rgc, int offset, int length)

  • Gibt die Breite der Länge langen Folge von Zeichen , beginnend bei Offset .

Klassenschrift

Die FontKlasse kapselt Informationen zu einer Schriftart. Eine neue Schriftart wird erstellt, indem eine Instanz der FontKlasse mit einem Namen, einem Stil und einer Punktgröße erstellt wird.

Schriftart f = neue Schriftart ("Dialog", Font.PLAIN, 12); 

Nach dem Erstellen kann einer Instanz des GraphicsObjekts eine Schriftart zugewiesen werden.

g.setFont (f); 

Das GraphicsObjekt verwendet dann die Schriftart für alle nachfolgenden textbezogenen Grafikoperationen.

Die FontKlasse bietet Methoden zum Abrufen von Informationen zu einer Schriftart, sobald diese erstellt wurde.

String getName()

  • Gibt den Namen der Schriftart zurück.

String getFamily()

  • Gibt den plattformspezifischen Namen der Schriftart zurück.

int getSize()

  • Gibt die Punktgröße der Schriftart zurück.

int getStyle()

  • Gibt den Stil der Schrift zurück.

boolean isBold()

  • Gibt zurück, truewenn die Schrift fett gedruckt ist.

boolean isItalic()

  • Gibt zurück, truewenn die Schrift kursiv ist.

boolean isPlain()

  • Gibt zurück, truewenn die Schriftart einfach ist.

String getName()

  • Gibt den Namen der Schriftart zurück.

Eine Demonstration

Das Applet in Abbildung 5 zeigt eine Textzeile mit einem Markup an, das ausreicht, um die Werte der zugehörigen Metriken aus dem obigen Abschnitt anzugeben. An der Grundlinie befindet sich eine dicke schwarze Linie. Zwei zusätzliche Zeilen geben den Auf- und Abstieg der betreffenden Schriftart an. Kleinere vertikale Linien geben die Breite der Zeichen an. In den drei Pulldown-Menüs können Sie eine Schriftart, ihren Stil und ihre Punktgröße auswählen.

Sie benötigen einen Java-fähigen Browser, um dieses Applet anzuzeigen. Abbildung 5: Ein interaktiver Browser für Schriftmetriken

Das Applet verwendet die Graphics, Fontund FontMetricsKlassen ausgiebig. Die Quelle finden Sie hier.

Fazit

Es scheint, dass sich die GraphicsKlasse als sehr fruchtbarer Boden für Erkundungen herausgestellt hat. Und die Expedition ist noch nicht beendet. Nächsten Monat werde ich meine Exkursion in die GraphicsKlasse mit einer Spalte über die Bildunterstützungsmethoden beenden. In dieser Spalte wird eine kleine Reihe zu anderen Themen im Zusammenhang mit Bildern und AWT beginnen, einschließlich Bildproduzenten und Bildkonsumenten.

Ich möchte mich bei allen bedanken, die sich die Zeit genommen haben, mir Ihre Kommentare, Ideen und Vorschläge zu schreiben. Mach weiter so.

Todd Sundsted schreibt Programme, seit Computer in Desktop-Modellen verfügbar sind. Obwohl Todd ursprünglich daran interessiert war, verteilte Objektanwendungen in C ++ zu erstellen, wechselte er zur Programmiersprache Java, als Java die offensichtliche Wahl für solche Dinge wurde. Todd ist Mitautor der Java Language API SuperBible, die jetzt überall in Buchhandlungen erhältlich ist. Neben dem Schreiben bietet Todd Unternehmen im Südosten der USA Internet- und Web-Beratungsdienste an.

Erfahren Sie mehr über dieses Thema

  • Die Klassen- GraphicsAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Die Klassen- FontAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Die Klassen- FontMetricsAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Verwenden der GraphicsKlasse:

    //www.javaworld.com/javaworld/jw-11-1996/jw-11-howto.html

  • Die Internationalisierungs-API:

    //www.javasoft.com/products/JDK/1.1/docs/guide/intl/index.html

  • Das Java Tutorial von Mary Campione und Kathy Walrath:

    //www.javasoft.com/books/Series/Tutorial/index.html

Diese Geschichte "Das Zeichnen von Text ist mit drei Java-Klassen einfach" wurde ursprünglich von JavaWorld veröffentlicht.