Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis
Vorwort
1 Neues in Java 8 und Java 7
2 Fortgeschrittene String-Verarbeitung
3 Threads und nebenläufige Programmierung
4 Datenstrukturen und Algorithmen
5 Raum und Zeit
6 Dateien, Verzeichnisse und Dateizugriffe
7 Datenströme
8 Die eXtensible Markup Language (XML)
9 Dateiformate
10 Grafische Oberflächen mit Swing
11 Grafikprogrammierung
12 JavaFX
13 Netzwerkprogrammierung
14 Verteilte Programmierung mit RMI
15 RESTful und SOAP-Web-Services
16 Technologien für die Infrastruktur
17 Typen, Reflection und Annotationen
18 Dynamische Übersetzung und Skriptsprachen
19 Logging und Monitoring
20 Sicherheitskonzepte
21 Datenbankmanagement mit JDBC
22 Java Native Interface (JNI)
23 Dienstprogramme für die Java-Umgebung
Stichwortverzeichnis

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java SE 8 Standard-Bibliothek von Christian Ullenboom
Das Handbuch für Java-Entwickler
Buch: Java SE 8 Standard-Bibliothek

Java SE 8 Standard-Bibliothek
Pfeil 11 Grafikprogrammierung
Pfeil 11.1 Grundlegendes zum Zeichnen
Pfeil 11.1.1 Die paint(Graphics)-Methode für das AWT-Frame
Pfeil 11.1.2 Die ereignisorientierte Programmierung ändert Fensterinhalte
Pfeil 11.1.3 Zeichnen von Inhalten auf ein JFrame
Pfeil 11.1.4 Auffordern zum Neuzeichnen mit repaint(…)
Pfeil 11.1.5 Java 2D-API
Pfeil 11.2 Einfache Zeichenmethoden
Pfeil 11.2.1 Linien
Pfeil 11.2.2 Rechtecke
Pfeil 11.2.3 Ovale und Kreisbögen
Pfeil 11.2.4 Polygone und Polylines
Pfeil 11.3 Zeichenketten schreiben und Fonts
Pfeil 11.3.1 Zeichenfolgen schreiben
Pfeil 11.3.2 Die Font-Klasse
Pfeil 11.3.3 Font-Metadaten durch FontMetrics *
Pfeil 11.4 Geometrische Objekte
Pfeil 11.4.1 Die Schnittstelle Shape
Pfeil 11.4.2 Pfade *
Pfeil 11.5 Das Innere und Äußere einer Form
Pfeil 11.5.1 Farben und die Paint-Schnittstelle
Pfeil 11.5.2 Farben mit der Klasse Color
Pfeil 11.5.3 Composite und XOR *
Pfeil 11.5.4 Dicke und Art der Linien von Formen bestimmen über Stroke *
Pfeil 11.6 Bilder
Pfeil 11.6.1 Eine Übersicht über die Bilder-Bibliotheken
Pfeil 11.6.2 Bilder mit ImageIO lesen
Pfeil 11.6.3 Ein Bild zeichnen
Pfeil 11.6.4 Splash-Screen *
Pfeil 11.6.5 Bilder skalieren *
Pfeil 11.6.6 Schreiben mit ImageIO
Pfeil 11.6.7 Asynchrones Laden mit getImage(…) und dem MediaTracker *
Pfeil 11.7 Weitere Eigenschaften von Graphics *
Pfeil 11.7.1 Eine Kopie von Graphics erstellen
Pfeil 11.7.2 Koordinatensystem verschieben
Pfeil 11.7.3 Beschnitt (Clipping)
Pfeil 11.7.4 Zeichenhinweise durch RenderingHints
Pfeil 11.7.5 Transformationen mit einem AffineTransform-Objekt
Pfeil 11.8 Drucken *
Pfeil 11.8.1 Drucken der Inhalte
Pfeil 11.8.2 Bekannte Drucker
Pfeil 11.9 Benutzerinteraktionen automatisieren, Robot und Screenshots *
Pfeil 11.9.1 Der Roboter
Pfeil 11.9.2 Automatisch in die Tasten hauen
Pfeil 11.9.3 Automatisierte Maus-Operationen
Pfeil 11.9.4 Methoden zur Zeitsteuerung
Pfeil 11.9.5 Bildschirmabzüge (Screenshots)
Pfeil 11.9.6 Funktionsweise und Beschränkungen
Pfeil 11.9.7 MouseInfo und PointerInfo
Pfeil 11.10 Zum Weiterlesen
 
Zum Seitenanfang

11.3Zeichenketten schreiben und Fonts Zur vorigen ÜberschriftZur nächsten Überschrift

Java kann Zeichenketten in verschiedenen Zeichensätzen (engl. fonts) auf die Zeichenfläche bringen. Zum Zeichnen gibt es unterschiedliche Methoden, von denen in jeder Java-Version Varianten und Klassen hinzukamen. Nicht viel besser ist es mit den Font-Informationen; auch dafür gibt es verwirrend viele Möglichkeiten zur Repräsentation der Metadaten.

 
Zum Seitenanfang

11.3.1Zeichenfolgen schreiben Zur vorigen ÜberschriftZur nächsten Überschrift

Die Methode drawString(…) bringt eine Unicode-Zeichenkette auf den Bildschirm.

Koordinatenangaben von drawString(…) und drawRect(…) im Vergleich

Abbildung 11.5Koordinatenangaben von drawString(…) und drawRect(…) im Vergleich

Die Parameter von drawString(…) beschreiben die zu schreibende Zeichenkette sowie die x- und y-Koordinaten der Schriftlinie.

abstract class java.awt.Graphics
  • abstract void drawString(String s, int x, int y)
    Schreibt einen String in der aktuellen Farbe und dem aktuellen Zeichensatz.

  • abstract void drawString(AttributedCharacterIterator iterator, int x, int y)
    Schreibt einen String, der durch den Attribut-Iterator gegeben ist.

Neben drawString(…) gibt es noch drawChars(char[], …) und drawBytes(byte[], …), die die Zeichenkette in einem anderen Format annehmen, nämlich als char- bzw. byte-Feld.

[»]Hinweis

Die Klasse TextLayout bietet weiter gehende Möglichkeiten, etwa Farbhervorhebung, Cursor-Funktionalität oder über TextHitInfo Tests, welches Zeichen sich an welcher Koordinate befindet, was bei Mausklicks nützlich ist. Ein draw(…) vom TextLayout bringt den Textbaustein auf den Schirm. Die Dokumentation listet etwas Quellcode zur Verdeutlichung auf.

 
Zum Seitenanfang

11.3.2Die Font-Klasse Zur vorigen ÜberschriftZur nächsten Überschrift

Die Methode drawString(…) verwendet immer den aktuellen Zeichensatz. Um diesen zu ändern, benutzen wir auf dem aktuellen Graphics-Objekt die Methode setFont(Font). Der Übergabeparameter ist ein Font-Objekt, das wir von woanders erfragen oder vorher erzeugen müssen.

class java.awt.Font
implements Serializable
  • Font(String name, int style, int size)
    Erzeugt ein Font-Objekt mit einem gegebenen Namen, einem gegebenen Stil und einer gegebenen Größe. Für den Stil lassen sich die symbolischen Konstanten Font.PLAIN, Font.ITALIC oder Font.BOLD nutzen, ein fetter und kursiver Zeichensatz erreicht Font.BOLD | Font.ITALIC (bzw. Font.BOLD + Font.ITALIC).

Der Name des Zeichensatzes ist entweder physikalisch (zum Beispiel »Verdana« oder »Geneva«) oder logisch mit Font-Konstanten DIALOG, DIALOG_INPUT, SANS_SERIF, SERIF und MONOSPACED, die später auf die physikalischen Font-Namen übertragen werden.[ 107 ](Die Webseite https://docs.oracle.com/javase/8/docs/technotes/guides/intl/fontconfig.html beschreibt diese Umsetzung.)

[zB]Beispiel

Ein Font-Objekt erzeugen:

Font f = new Font( Font.SERIF, Font.PLAIN, 14 );

Häufig wird dieses Zeichensatzobjekt sofort in setFont(Font) genutzt, so wie:

setFont( new Font( "Verdana", Font.BOLD, 20 ) );

Ist im Programm der aktuell verwendete Zeichensatz nötig, können wir getFont() von der Graphics-Klasse verwenden.

Einen neuen Font aus einem gegebenen Font ableiten

Steht ein Font zur Verfügung und soll ausgehend von diesem ein neues Font-Objekt mit einer kleinen Änderung, etwa in der Größe oder im Attribut (fett, kursiv), oder sogar nach einer AffineTransformation hergestellt werden, so lassen sich die deriveFont(…)-Methoden einsetzen.

[zB]Beispiel

Ausgehend von einem existierenden Font-Objekt f soll ein neuer Font mit dem gleichen Zeichensatz und Stil abgeleitet werden, der jedoch 20 Punkt groß ist:

Font font = f.deriveFont( 20f );
 
Zum Seitenanfang

11.3.3Font-Metadaten durch FontMetrics * Zur vorigen ÜberschriftZur nächsten Überschrift

Jedes Font-Objekt beinhaltet Informationen zur Schriftsatzfamilie, zum Schriftsatznamen sowie zu Größe und Stil. Was es nicht bietet, ist Zugriff auf Metadaten, etwa auf Abmessungen des Zeichensatzes. Um diese Daten aufzuspüren, ist ein FontMetrics-Objekt nötig. Es verwaltet metrische Informationen, die mit einer Schriftart verbunden sind. Dazu gehören Ober- und Unterlänge, Schrifthöhe und Zeilenabstand.

Da die Klasse FontMetrics keinen öffentlichen Konstruktor und keine statische Fabrikmethode besitzt, müssen wir ein FontMetrics-Objekt von einer anderen Stelle aus erfragen. Es bieten sich unter anderem an:

  • getFontMetrics() von Graphics

  • getFontMetrics(Font) von Graphics

  • getFontMetrics(Font) von Component

  • getFontMetrics(Font) von Toolkit (deprecated)

Ein FontMetrics-Objekt lässt sich merkwürdigerweise nicht direkt vom Font-Objekt erfragen. (Umgekehrt liefert aber getFont() aus FontMetrics das Font-Objekt, das diese Metriken beschreibt.)

In der paint(Graphics g)-Methode kann also mittels

FontMetrics fm = g.getFontMetrics();

auf die Metriken des aktuellen Zeichensatzes zugegriffen werden.

abstract class java.awt.Graphics
  • FontMetrics getFontMetrics()
    Liefert die Font-Metriken zum aktuellen Zeichensatz.

  • abstract FontMetrics getFontMetrics(Font f)
    Liefert die Font-Metriken für den Zeichensatz f.

Die Klasse FontMetrics bietet die folgenden Methoden an, wobei sich alle Angaben auf das jeweilige Zeichensatzobjekt beziehen. Beziehen sich die Rückgabeparameter auf die Zeichengröße, so erfolgt die Angabe immer in Pixeln.

abstract class java.awt.FontMetrics
implements Serializable
  • int charWidth(int ch)

  • int charWidth(char ch)
    Liefert die Breite zu einem Zeichen.

  • int charsWidth(char[] data, int off, int len)

  • int bytesWidth(byte[] data, int off, int len)
    Gibt die Breite aller Zeichen des Feldes zurück. Beginnt bei off und liest len Zeichen.

  • int stringWidth(String str)
    Gibt die Breite der Zeichenkette zurück, wenn diese gezeichnet würde. Die Methode nutzt intern charsWidth().

  • int getAscent()
    Gibt den Abstand von der Grundlinie zur oberen Grenze (Oberlänge) zurück. Entspricht standardmäßig getSize() vom Font-Objekt.

  • int getDescent()
    Gibt den Abstand von der Grundlinie zur unteren Grenze (Unterlänge) zurück, standardmäßig 0.

  • int getLeading()
    Gibt den Durchschuss (engl. leading) zurück. Der Durchschuss ist der Standardabstand zwischen zwei Zeilen.

  • int getHeight()
    Gibt den Standardzeilenabstand (Abstand zwischen Grundlinie und Grundlinie) in Pixeln zurück. Er berechnet sich aus Durchschuss + Oberlänge + Unterlänge. In Quellcode ausgedrückt: getAscent() + getDescent() + getLeading().

  • int getMaxAdvance()
    Liefert die Breite des breitesten Zeichens bzw. –1, wenn unbekannt.

  • int getMaxAscent()
    Liefert das Maximum aller Oberlängen in Pixeln. Einige Zeichen können sich oberhalb der Oberlänge bewegen. Die Standardimplementierung leitet einfach nur an getAscent() weiter.

  • int getMaxDescent()
    Liefert das Maximum aller Unterlängen in Pixeln. Leitet standardmäßig an getDescent() weiter.

  • int[] getWidths()
    Liefert in einem Ganzzahlfeld die Breiten – ermittelt durch charWidth(char) – der ersten 256 Zeichen zurück.

  • Font getFont()
    Liefert den aktuellen Zeichensatz.

Die wichtigsten Properties der Font-Metadaten

Abbildung 11.6Die wichtigsten Properties der Font-Metadaten

[»]Hinweis

Die Ergebnisse von FontMetrics sind bescheiden und mitunter ungenau. Bessere Ergebnisse, etwa über die Maße eines zu zeichnenden Strings, und interessante Zusatzmethoden bieten FontRenderContext, TextLayout und LineMetrics:

Font font = ...;
FontRenderContext frc = g.getFontRenderContext();
TextLayout layout = new TextLayout( "Text", font, frc );
Rectangle2D bounds = layout.getBounds();

LineMetrics bietet Angaben, wie zum Beispiel die nötige Dicke einer Linie beim Unterstreichen und Durchstreichen:

Font font = ...;
FontRenderContext frc = ...;
LineMetrics lm = font.getLineMetrics( str, g.getFontRenderContext() );
Klassendiagramm von FontMetrics

Abbildung 11.7Klassendiagramm von FontMetrics

Einen String unterstreichen

Wir wollen nun stringWidth(String) und die Metadaten nutzen, um einen unterstrichenen Text darzustellen. Dafür gibt es keine offensichtliche Standardmethode in der Java-API. Also schreiben wir uns eine eigene statische Methode drawUnderlinedString(Graphics, int, int, s), die die Koordinaten sowie den String übergeben bekommt und dann mit drawString(String, int, int) die Zeichenkette schreibt. Als Zweites zeichnet drawLine(…) eine Linie unter der Grundlinie des Textes mit einer Verschiebung und Dicke, die das von Graphics erfragte LineMetrics angibt, und mit der Länge, die das FontMetrics-Objekt für die Zeichenkette liefert:

Listing 11.4com/tutego/insel/ui/graphics/DrawUnderlinedString.java, drawUnderlinedString()

public static void drawUnderlinedString( Graphics g, int x, int y, String s ) {
g.drawString( s, x, y );

FontMetrics fm = g.getFontMetrics();
LineMetrics lm = fm.getLineMetrics( s, g );

g.fillRect( x, y + (int) lm.getUnderlineOffset(),
fm.stringWidth(s), (int) lm.getUnderlineThickness() );
}

Natürlich achtet so eine kleine Methode nicht auf das Aussparen von Buchstaben, die unter der Grundlinie liegen, und so sind Buchstaben wie »y« oder »q« unten gnadenlos durchgestrichen.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java SE 8 Standard-Bibliothek Java SE 8 Standard-Bibliothek
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Java ist auch eine Insel
Java ist auch eine Insel


Zum Rheinwerk-Shop: Professionell entwickeln mit Java EE 8
Professionell entwickeln mit Java EE 8


Zum Rheinwerk-Shop: Besser coden
Besser coden


Zum Rheinwerk-Shop: Entwurfsmuster
Entwurfsmuster


Zum Rheinwerk-Shop: IT-Projektmanagement
IT-Projektmanagement


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2018
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern