Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Generics<T>
8 Äußere.innere Klassen
9 Besondere Klassen der Java SE
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Bits und Bytes und Mathematisches
13 Datenstrukturen und Algorithmen
14 Threads und nebenläufige Programmierung
15 Raum und Zeit
16 Dateien, Verzeichnisse und Dateizugriffe
17 Datenströme
18 Die eXtensible Markup Language (XML)
19 Grafische Oberflächen mit Swing
20 Grafikprogrammierung
21 Netzwerkprogrammierung
22 Verteilte Programmierung mit RMI
23 JavaServer Pages und Servlets
24 Datenbankmanagement mit JDBC
25 Reflection und Annotationen
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
geb., mit DVD
1482 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1506-0
Pfeil 19 Grafische Oberflächen mit Swing
  Pfeil 19.1 Das Abstract Window Toolkit und Swing
    Pfeil 19.1.1 SwingSet-Demos
    Pfeil 19.1.2 Abstract Window Toolkit (AWT)
    Pfeil 19.1.3 Java Foundation Classes
    Pfeil 19.1.4 Was Swing von AWT unterscheidet
  Pfeil 19.2 Mit NetBeans zur ersten Oberfläche
    Pfeil 19.2.1 Projekt anlegen
    Pfeil 19.2.2 Gui-Klasse hinzufügen
    Pfeil 19.2.3 Programm starten
    Pfeil 19.2.4 Grafische Oberfläche aufbauen
    Pfeil 19.2.5 Swing-Komponenten-Klassen
    Pfeil 19.2.6 Funktionalität geben
  Pfeil 19.3 Fenster unter grafischen Oberflächen
    Pfeil 19.3.1 Swing-Fenster mit javax.swing.JFrame darstellen
    Pfeil 19.3.2 Fenster schließbar machen – setDefaultCloseOperation()
    Pfeil 19.3.3 Sichtbarkeit des Fensters
    Pfeil 19.3.4 Größe und Position des Fensters verändern
    Pfeil 19.3.5 Fenster- und Dialog-Dekoration, Transparenz *
    Pfeil 19.3.6 Dynamisches Layout während einer Größenänderung *
  Pfeil 19.4 Beschriftungen (JLabel)
    Pfeil 19.4.1 Mehrzeiliger Text, HTML in der Darstellung
  Pfeil 19.5 Icon und ImageIcon für Bilder auf Swing-Komponenten
    Pfeil 19.5.1 Die Klasse ImageIcon
    Pfeil 19.5.2 Die Schnittstelle Icon und eigene Icons *
  Pfeil 19.6 Es tut sich was – Ereignisse beim AWT
    Pfeil 19.6.1 Swings Ereignisquellen und Horcher (Listener)
    Pfeil 19.6.2 Listener implementieren
    Pfeil 19.6.3 Listener bei dem Ereignisauslöser anmelden/abmelden
    Pfeil 19.6.4 Aufrufen der Listener im AWT-Event-Thread
    Pfeil 19.6.5 Adapterklassen nutzen
    Pfeil 19.6.6 Innere Mitgliedsklassen und innere anonyme Klassen
    Pfeil 19.6.7 Ereignisse etwas genauer betrachtet *
  Pfeil 19.7 Schaltflächen
    Pfeil 19.7.1 Normale Schaltflächen (JButton)
    Pfeil 19.7.2 Der aufmerksame »ActionListener«
    Pfeil 19.7.3 Schaltflächen-Ereignisse vom Typ »ActionEvent«
    Pfeil 19.7.4 Basisklasse »AbstractButton«
    Pfeil 19.7.5 Wechselknopf (JToggleButton)
  Pfeil 19.8 Swing Action *
  Pfeil 19.9 JComponent und Component als Basis aller Komponenten
    Pfeil 19.9.1 Hinzufügen von Komponenten
    Pfeil 19.9.2 Tooltips (Kurzhinweise)
    Pfeil 19.9.3 Rahmen (Border) *
    Pfeil 19.9.4 Fokus und Navigation *
    Pfeil 19.9.5 Ereignisse jeder Komponente *
    Pfeil 19.9.6 Die Größe und Position einer Komponente *
    Pfeil 19.9.7 Komponenten-Ereignisse *
    Pfeil 19.9.8 Undurchsichtige (opake) Komponente *
    Pfeil 19.9.9 Properties und Listener für Änderungen *
  Pfeil 19.10 Container
    Pfeil 19.10.1 Standardcontainer (JPanel)
    Pfeil 19.10.2 Bereich mit automatischen Rollbalken (JScrollPane)
    Pfeil 19.10.3 Reiter (JTabbedPane)
    Pfeil 19.10.4 Teilungs-Komponente (JSplitPane)
  Pfeil 19.11 Alles Auslegungssache: die Layoutmanager
    Pfeil 19.11.1 Übersicht über Layoutmanager
    Pfeil 19.11.2 Zuweisen eines Layoutmanagers
    Pfeil 19.11.3 Im Fluss mit FlowLayout
    Pfeil 19.11.4 BoxLayout
    Pfeil 19.11.5 Mit BorderLayout in alle Himmelsrichtungen
    Pfeil 19.11.6 Rasteranordnung mit GridLayout
    Pfeil 19.11.7 Der GridBagLayoutmanager *
    Pfeil 19.11.8 Null-Layout *
    Pfeil 19.11.9 Weitere Layoutmanager
  Pfeil 19.12 Rollbalken und Schieberegler
    Pfeil 19.12.1 Schieberegler (JSlider)
    Pfeil 19.12.2 Rollbalken (JScrollBar) *
  Pfeil 19.13 Kontrollfelder, Optionsfelder, Kontrollfeldgruppen
    Pfeil 19.13.1 Kontrollfelder (JCheckBox)
    Pfeil 19.13.2 ItemSelectable, ItemListener und das ItemEvent
    Pfeil 19.13.3 Sich gegenseitig ausschließende Optionen (JRadioButton)
  Pfeil 19.14 Fortschritte bei Operationen überwachen *
    Pfeil 19.14.1 Fortschrittsbalken (JProgressBar)
    Pfeil 19.14.2 Dialog mit Fortschrittsanzeige (ProgressMonitor)
  Pfeil 19.15 Menüs und Symbolleisten
    Pfeil 19.15.1 Die Menüleisten und die Einträge
    Pfeil 19.15.2 Menüeinträge definieren
    Pfeil 19.15.3 Einträge durch Action-Objekte beschreiben
    Pfeil 19.15.4 Mit der Tastatur: Mnemonics und Shortcut
    Pfeil 19.15.5 Der Tastatur-Shortcut (Accelerator)
    Pfeil 19.15.6 Tastenkürzel (Mnemonics)
    Pfeil 19.15.7 Symbolleisten alias Toolbars
    Pfeil 19.15.8 Popup-Menüs
  Pfeil 19.16 Das Model-View-Controller-Konzept
  Pfeil 19.17 Auswahlmenüs, Listen und Spinner
    Pfeil 19.17.1 Auswahlmenü (JComboBox)
    Pfeil 19.17.2 Zuordnung einer Taste mit einem Eintrag *
    Pfeil 19.17.3 Datumsauswahl
    Pfeil 19.17.4 Listen (JList)
    Pfeil 19.17.5 Drehfeld (JSpinner) *
  Pfeil 19.18 Textkomponenten
    Pfeil 19.18.1 Text in einer Eingabezeile
    Pfeil 19.18.2 Die Oberklasse der Text-Komponenten (JTextComponent)
    Pfeil 19.18.3 Geschützte Eingaben (JPasswordField)
    Pfeil 19.18.4 Validierende Eingabefelder (JFormattedTextField)
    Pfeil 19.18.5 Einfache mehrzeilige Textfelder (JTextArea)
    Pfeil 19.18.6 Editor-Klasse (JEditorPane) *
  Pfeil 19.19 Tabellen (JTable)
    Pfeil 19.19.1 Ein eigenes Tabellen-Model
    Pfeil 19.19.2 Basisklasse für eigene Modelle (AbstractTableModel)
    Pfeil 19.19.3 Vorgefertigtes Standard-Modell (DefaultTableModel)
    Pfeil 19.19.4 Ein eigener Renderer für Tabellen
    Pfeil 19.19.5 Zell-Editoren
    Pfeil 19.19.6 Größe und Umrandung der Zellen *
    Pfeil 19.19.7 Spalteninformationen*
    Pfeil 19.19.8 Tabellenkopf von Swing-Tabellen *
    Pfeil 19.19.9 Selektionen einer Tabelle *
    Pfeil 19.19.10 Automatisches Sortieren und Filtern mit RowSorter *
  Pfeil 19.20 Bäume (JTree)
    Pfeil 19.20.1 JTree und sein TreeModel und TreeNode
    Pfeil 19.20.2 Selektionen bemerken
    Pfeil 19.20.3 Das TreeModel von JTree *
  Pfeil 19.21 JRootPane und JDesktopPane *
    Pfeil 19.21.1 Wurzelkomponente der Top-Level-Komponenten (JRootPane)
    Pfeil 19.21.2 JDesktopPane und die Kinder JInternalFrame
    Pfeil 19.21.3 JLayeredPane
  Pfeil 19.22 Dialoge und Window-Objekte
    Pfeil 19.22.1 JWindow und JDialog
    Pfeil 19.22.2 Modal oder nicht-modal
    Pfeil 19.22.3 Standarddialoge mit JOptionPane
    Pfeil 19.22.4 Der Dateiauswahldialog
    Pfeil 19.22.5 Der Farbauswahldialog JColorChooser *
  Pfeil 19.23 Flexibles Java-Look-and-Feel
    Pfeil 19.23.1 Look and Feel global setzen
    Pfeil 19.23.2 UIManager
    Pfeil 19.23.3 Windowsoptik mit JGoodies Looks verbessern *
  Pfeil 19.24 Swing-Komponenten neu erstellen oder verändern *
  Pfeil 19.25 Die Zwischenablage (Clipboard)
    Pfeil 19.25.1 Clipboard-Objekte
    Pfeil 19.25.2 Auf den Inhalt zugreifen mit »Transferable«
    Pfeil 19.25.3 DataFlavor ist das Format der Daten in der Zwischenablage
    Pfeil 19.25.4 Einfügungen in der Zwischenablage erkennen
    Pfeil 19.25.5 Drag
  Pfeil 19.26 AWT, Swing und die Threads
    Pfeil 19.26.1 Ereignisschlange (EventQueue) und AWT-Event-Thread
    Pfeil 19.26.2 Swing ist nicht thread-sicher
    Pfeil 19.26.3 »invokeLater()« und »invokeAndWait()«
    Pfeil 19.26.4 SwingWorker
    Pfeil 19.26.5 Eigene Ereignisse in die Queue setzen *
    Pfeil 19.26.6 Auf alle Ereignisse hören *
  Pfeil 19.27 Barrierefreiheit mit der Java Accessibility API
  Pfeil 19.28 Zeitliches Ausführen mit dem javax.swing.Timer
  Pfeil 19.29 Zum Weiterlesen


Rheinwerk Computing - Zum Seitenanfang

19.3 Fenster unter grafischen Oberflächen  Zur nächsten ÜberschriftZur vorigen Überschrift


Rheinwerk Computing - Zum Seitenanfang

19.3.1 Swing-Fenster mit javax.swing.JFrame darstellen  Zur nächsten ÜberschriftZur vorigen Überschrift

Um unter Swing ein Fenster zu öffnen, müssen wir die zentrale Klasse JFrame über das Paket javax.swing einbinden. Die allermeisten Swing-Komponenten befinden sich in diesem Paket, und nur ausgewählte komplexe Klassen wie Textkomponenten sind in Unterpaketen untergebracht. Viele Methoden der JFrame-Klasse stammen von den Oberklassen java.awt.Frame bzw. java.awt.Window.

Listing 19.1  com/tutego/insel/ui/swing/ClockApplication.java

package com.tutego.insel.ui.swing;

import java.util.Date;
import javax.swing.*;

public class ClockApplication
{
  public static void main( String[] args )
  {
    JFrame f = new JFrame( "Uhrzeit" );
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setSize( 250, 100 );
    f.add( new JLabel( String.format( "%tT", new Date() ) ) );
    f.setVisible( true );
  }
}

Abbildung 19.2  Swing-Fenster mit Datum

Aus dem Programm lassen sich unterschiedliche Elemente ablesen:

  • Der parametrisierte Konstruktor von JFrame setzt automatisch einen Titel für das Fenster. Der Titel eines Fensters lässt sich aber auch später mit setTitle() wieder ändern. Der Standardkonstruktor lässt den Titel leer.
  • Mit setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) setzen wir einen Zustand, sodass die Anwendung mit einem Klick auf das X sofort beendet wird. Das ist zum Testen praktisch, aber für echte Gui-Anwendungen natürlich keine Lösung.
  • Die Methode setSize() setzt die Fenstergröße in Pixel.
  • Abschließend zeigt setVisbible(true) das Fenster an.

Mit »add()« auf den Container

Das Programm erzeugt ein JLabel-Objekt und setzt es mit add() auf den JFrame. Der JFrame referenziert einen eigenen Kind-Container, der Content-Pane genannt wird, und unser JLabel aufnimmt.

Vor Java 5 konnte nicht direkt mit add() gearbeitet werden, da der JFrame genau genommen nicht nur einen Container verwaltet, sondern viele, und wir mussten uns die Content-Pane mit getContentPane() erfragen und dann add() auf diesem Container-Objekt ausführen:

f.getContentPane().add( component );

class javax.swing.JFrame
extends Frame
implements WindowConstants, Accessible, RootPaneContainer

  • JFrame() Erzeugt ein neues JFrame-Objekt, das am Anfang unsichtbar ist.
  • JFrame( String title ) Erzeugt ein neues JFrame-Objekt mit einem Fenster-Titel, das am Anfang unsichtbar ist.

Der Titel eines AWT- und Swing-Fensters lässt sich später mit setTitle() wieder ändern.


Rheinwerk Computing - Zum Seitenanfang

19.3.2 Fenster schließbar machen – setDefaultCloseOperation()  Zur nächsten ÜberschriftZur vorigen Überschrift

Die JFrame-Methode setDefaultCloseOperation() mit dem Argument JFrame.EXIT_ON_ CLOSE beendet die Applikation über System.exit(), wenn der Benutzer über das ¥ in der Fensterleiste das Fenster schließt. Ohne die Anweisung verschwindet lediglich das Fenster in den Hintergrund: Es wird also geschlossen, die Applikation wird jedoch nicht beendet. Neben EXIT_ON_CLOSE gibt es weitere Konstanten. Mit DO_NOTHING_ON_CLOSE bekommen wir das Standardverhalten eines AWT-Frames: Beim Schließen passiert nichts. Weder geht das Fenster zu, noch beendet die JVM das Programm.


class javax.swing.JFrame
extends Frame
implements WindowConstants, Accessible, RootPaneContainer

  • void setDefaultCloseOperation( int operation ) Bestimmt, was passieren soll, wenn der Benutzer das Fenster schließt. Gültig sind die Konstanten WindowConstants.DO_NOTHING_ON_CLOSE, WindowConstants.HIDE_ON_CLOSE, WindowConstants.DISPOSE_ON_CLOSE, JFrame.EXIT_ON_CLOSE. Eine weitere Erklärung findet sich bei der Ereignisbehandlung.
  • int getDefaultCloseOperation() Liefert die eingestellte Eigenschaft beim Schließen des Fensters.

Hinweis Ein AWT-Fenster (also java.awt.Frame) kann nicht mit ´ in der Titelleiste geschlossen werden, da noch keine Ereignisbehandlung implementiert ist – der Frame bietet auch keine Methode setDefaultCloseOperation() an. Wir müssten selbst Fensterereignisse abfangen. Unter Swing horcht der JFrame selbstständig auf ein WindowEvent, reagiert in der protected-Methode processWindowEvent() auf das WINDOW_CLOSING und kann das Fenster nach Wunsch auch ohne hinzugefügten Ereignisbehandler schließen.



Rheinwerk Computing - Zum Seitenanfang

19.3.3 Sichtbarkeit des Fensters  Zur nächsten ÜberschriftZur vorigen Überschrift

Nach der Konstruktion ist das Fenster vorbereitet, aber erst der Aufruf von setVisible(true) macht es sichtbar. setVisible() stammt, wie auch weitere Methoden, die für JFrame und Frame interessant sind, von der Oberklasse Window.


class java.awt.Window
extends Container
implements Accessible

  • void setVisible( boolean b ) Der Aufruf von setVisible(true) zeigt das Fenster an. Liegt es im Hintergrund, holt es der Aufruf wieder in den Vordergrund.
  • boolean isShowing() Liefert true, wenn sich das Fenster auf dem Bildschirm befindet.
  • void toBack() Reiht das Fenster als hinterstes in die Fensterreihenfolge ein. Ein anderes Fenster wird somit sichtbar.
  • void toFront() Platziert das Fenster als vorderstes in der Darstellung aller Fenster auf dem Schirm.

Hinweis In der Java-Steinzeit wurden die Methoden show() und hide() genutzt. Sie sind heute deprecated.



Rheinwerk Computing - Zum Seitenanfang

19.3.4 Größe und Position des Fensters verändern  Zur nächsten ÜberschriftZur vorigen Überschrift

Die aus Window geerbte Methode setSize() verändert die Maße des Fensters.


class java.awt.Window
extends Container
implements Accessible

  • void setSize( int width, int height ) Verändert die Größe einer Komponente.
  • void setSize( Dimension d ) Verändert die Größe einer Komponente; entspricht setSize(d.width, d.height).

Hinweis Die Position eines Fensters kann mit setLocation() geändert werden. Wer das Fenster zum Beispiel in der Mitte des Bildschirms positionieren möchte, kann aber einfach die Window-Objektmethode setLocationRelativeTo(null) aufrufen.


Wurde vor der Anzeige mit setVisible(true) die Methode setLocationByPlatform(true) von einem java.awt.Window aufgerufen, wählt der Fenster-Manager automatisch eine gute Position, und setLocation() ist nicht mehr nötig. Mit isLocationByPlatform() lässt sich später erfragen, wer die Position gesetzt hat; die Rückgabe ist true, wenn es das Fenstersystem war, und false, wenn wir mit setLocation() an der Position herumgespielt haben.


abstract class java.awt.Component
implements ImageObserver, MenuContainer, Serializable

  • void setLocation( int x, int y ) Setzt die Komponente an die Position x, y; ehemals move().
  • void setLocation( Point p ) Setzt die Komponente an die gewünschte Position.
  • Point getLocation() Liefert die Position der Komponente als Point-Objekt.

Beispiel Auch das Vergrößern eines Fensters f, sodass es die maximale Ausdehnung annimmt, ist mit einer Methode möglich. Betrachten wir die folgenden Zeilen, die hinter eine setVisible(true)-Methode zum Beispiel im Konstruktor gesetzt werden:

f.setLocation( 0, 0 );
f.resize( Toolkit.getDefaultToolkit().getScreenSize() );

Die Größe des Bildschirms erfragt getScreenSize(), eine Methode des Toolkit-Objekts. Soll das Fenster nicht in der Größe veränderbar sein, setzen wir setResizable(false):

JFrame frame = new JFrame( "Du kriegst mich nicht klein." );
frame.setResizable( false );


Rheinwerk Computing - Zum Seitenanfang

19.3.5 Fenster- und Dialog-Dekoration, Transparenz *  Zur nächsten ÜberschriftZur vorigen Überschrift

Für bestimmte Anwendungen ist es günstig, bei Fenstern und Dialogen die Standarddialogelemente (etwa Titelleiste, Systemmenü) auszuschalten, etwa dann, wenn der Benutzer das Fenster nicht verkleinern soll. Für die Abschaltung bieten die Klassen Frame und Dialog (und damit auch die Unterklassen JFrame und JDialog) eine Methode setUndecorated(), die vor der Darstellung aufgerufen werden kann. Ist das Fenster schon dargestellt, folgt eine Ausnahme, denn die Dekoration lässt sich nicht einfach ein- oder ausblenden. Hier hilft folgender Trick: Zuerst entfernt dispose() das Fenster, dann kann setUndecorated() folgen, und ein setVisible(true) stellt das Fenster neu dar.


class java.awt.Frame extends Window implements MenuContainer
class java.awt.Dialog extends Window

  • void setUndecorated( boolean undecorated ) Setzt/löscht die Dekoration.
  • boolean isUndecorated() Erfragt die Dekoration.

Die JFrame-Methode setDefaultLookAndFeelDecorated(true) gibt dem jeweiligen Look & Feel den Hinweis, dass es die Fensterdekoration selbst darstellen kann.

Transparenz und nicht-rechteckige Fenster

Mit den Window-Mehoden setOpacity(float) und setShape(Shape) können alle von Window abgeleiteten Klassen, also auch Frame und JFrame transparent sein und beschnitten werden. Sofern es also das grafische System unterstützt, können Fenster durchscheinen und auch nicht-rechteckig dargestellt werden.


Beispiel Stelle ein Fenster zu 50 % duchscheinend dar und lasse nur in Inhalte zu, die in einem angegeben Kreis liegen:

Listing 19.2  com/tutego/insel/ui/awt/TranslucentNonRectFrame.java, main()

JFrame f = new JFrame();
f.setSize( 100, 100 );
f.setOpacity( 0.5F );
f.setShape( new Ellipse2D.Float(0.0F, 0.0F, 100.0F, 100.0F) );
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.setVisible( true );


Rheinwerk Computing - Zum Seitenanfang

19.3.6 Dynamisches Layout während einer Größenänderung *  topZur vorigen Überschrift

Wird ein Fenster vergrößert, dann kann während der Größenänderung der Inhalt sofort neu ausgerichtet und gezeichnet werden oder auch nicht. Wird er nicht dynamisch angepasst, dann sieht der Benutzer diese Anpassung erst nach dem Loslassen der Maus, wenn die Größenänderung abgeschlossen wurde. Dieses dynamische Vergrößern lässt sich im Toolkit-Objekt einstellen, über Toolkit.getDefaultToolkit().setDynamicLayout(true). Nicht jedes Toolkit unterstützt allerdings diese Fähigkeit! Ob es das tut, verrät Toolkit.getDefaultToolkit().getDesktopProperty("awt.dynamicLayoutSupported").



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
 <<   zurück
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
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