11. GUI-Programmierung mit SWING Überblick 11.1 Einführung 11.2 Einfache Swing Komponenten 11.3 Ereignisbehandlung und Adapterklassen 11.4 Zeichnen 11.5 Dialoge 11.6 Layout Manager 11.7 Komplexere Swing Komponenten Prof. Dr. Björn Dreher Liste Programmieren - Java 548 11. GUI-Programmierung mit SWING Überblick: 11.4. Zeichnen 11.4.1 Der Java graphische Context Prof. Dr. Björn Dreher Liste Programmieren - Java 549
11.4.1 Der Java graphische Kontext Basis Klassen für 2D-Darstellungen Graphics Color Font FontMetrics Polygon Java2D API BasicStroke GradientPaint TexturePaint GeneralPath Arc2D, Ellipse2D, Line2D, Rectangle2D, RoundRectangle2D Prof. Dr. Björn Dreher Liste Programmieren - Java 550 11.4.1 Der Java graphische Kontext Koordinatensystem (0, 0) +x x-achse (x, y) +y y-achse Ausgangspunkt: Linke obere Ecke Einheit: Pixel Prof. Dr. Björn Dreher Liste Programmieren - Java 551
11.4.1 Der Java graphische Kontext Graphischer Kontext Graphics Objekt Methoden zum Zeichnen Font-Manipulation Farbwahl, usw. Zum Zeichnen wird oft die Methode paint(graphics g) aufgerufen paint() kann überschrieben werden Im Innern kann dann g zum Zeichnen benutzt werden Wird normalerweise indirekt über repaint() aufgerufen Graphics ist eine abstrakte Klasse Konkrete Klasse realisiert die Schnittstelle für die Zielplattform (Windows, Unix, Mac) Bei Swing ist es tatsächlich eine Instanz von Graphics2D Unterstützt zusätzlich 2D-API, Nachfahre von Graphics Prof. Dr. Björn Dreher Liste Programmieren - Java 552 11. GUI-Programmierung mit SWING Überblick: 11.4. Zeichnen 11.4.1 Der Java graphische Context Prof. Dr. Björn Dreher Liste Programmieren - Java 553
JPanel Normalerweise ein Aggregat für andere Swing Komponenten Kann auch Zeichenoberflächen und mausempfindliche Bereiche definieren Vermeidung von Konflikten zwischen direkter Verwendung von Graphics und GUI-Komponenten Methode paint() Nur von der Swing-Laufzeitumgebung aufgerufen, niemals direkt aus Benutzercode Stattdessen repaint() Bittet Swing, die Komponente bei nächster Gelegenheit sich zeichnen zu lassen Prof. Dr. Björn Dreher Liste Programmieren - Java 554 JPanel Methode paint() (fortgesetzt) Zeichnet die Komponente selbst und alle darin enthaltenen Unterkomponenten Delegiert den paint()-aufruf an diese weiter Überschreibt man paint(), muss man unbedingt zuerst die geerbte Methode aufrufen Klassen, die von JComponent abstammen, enthalten Methode paintcomponent() Zeichnet nur die eigene Komponente Man muss sich um enthaltene Komponemten nicht kümmern Diese Methode sollte überschrieben werden, um innerhalb des Panels zu zeichnen Zuvor sollte die geerbte Methode aufgerufen werden Prof. Dr. Björn Dreher Liste Programmieren - Java 555
JPanel JComponent unterstützt Transparenz und deren Nachfahren sollten das auch tun Gesteuert durch Methode setopaque() Parameter false: Komponente ist transparent Richtige Handhabung in JComponent s Methode paintcomponent() Transparent: Hintergrund bleibt unverändert Opaque: Hintergrund wird gelöscht Daher muss geerbtes paintcomponent() unbedingt aufgerufen werden Prof. Dr. Björn Dreher Liste Programmieren - Java 556 Wann wird Komponente neu gezeichnet? Swing-Komponenten Methode repaint(): Komponente soll sobald wie möglich neu gezeichnet werden: Drei einzelne Methoden (in dieser Reihenfolge): paintcomponent Hauptmethode zum Zeichnen paintborder Zeichnet die Umrandung (falls es eine gibt). Nicht überschreiben! paintchildren Veranlasst jede Komponente, die in der eigenen enthalten ist, sich selbst zu zeichnen. Nicht überschreiben! AWT-Komponenten Methode repaint() Methode update() von Component wird aufgerufen Löscht Hintergrund der Komponente Ruft ihrerseits Methode paint() Prof. Dr. Björn Dreher Liste Programmieren - Java 557
CustomPanel public class CustomPanel extends JPanel { public final static int CIRCLE = 1, SQUARE = 2; private int shape; // use shape to draw an oval or rectangle public void paintcomponent( Graphics g ) { super.paintcomponent( g ); if ( shape == CIRCLE ) g.filloval( 50, 10, 60, 60 ); else if ( shape == SQUARE ) g.fillrect( 50, 10, 60, 60 ); // set shape value and repaint CustomPanel public void draw( int shapetodraw ) { shape = shapetodraw; repaint(); // end class CustomPanel Prof. Dr. Björn Dreher Liste Programmieren - Java 558 11. GUI-Programmierung mit SWING Überblick: 11.4. Zeichnen 11.4.1 Der Java graphische Context Prof. Dr. Björn Dreher Liste Programmieren - Java 559
CustomPanelTest public class CustomPanelTest extends JFrame { private JPanel buttonpanel; private CustomPanel mypanel; private JButton circlebutton, squarebutton; // set up GUI public CustomPanelTest() { super( "CustomPanel Test" ); // create custom drawing area mypanel = new CustomPanel(); mypanel.setbackground( Color.green ); // set up squarebutton squarebutton = new JButton( "Square" ); Prof. Dr. Björn Dreher Liste Programmieren - Java 560 CustomPanelTest (fortgesetzt) squarebutton.addactionlistener( // anonymous inner class to handle // squarebutton events new ActionListener() { // draw a square public void actionperformed( ActionEvent event ) { mypanel.draw( CustomPanel.SQUARE ); // end anonymous inner class ); // end call to addactionlistener Prof. Dr. Björn Dreher Liste Programmieren - Java 561
CustomPanelTest (fortgesetzt) circlebutton = new JButton( "Circle" ); circlebutton.addactionlistener( // anonymous inner class to handle // circlebutton events new ActionListener() { // draw a circle public void actionperformed( ActionEvent event ) { mypanel.draw( CustomPanel.CIRCLE ); // end anonymous inner class ); // end call to addactionlistener Prof. Dr. Björn Dreher Liste Programmieren - Java 562 CustomPanelTest (fortgesetzt) // set up panel containing buttons buttonpanel = new JPanel(); buttonpanel.setlayout( new GridLayout( 1, 2 ) ); buttonpanel.add( circlebutton ); buttonpanel.add( squarebutton ); // attach button panel & custom drawing area to // content pane Container container = getcontentpane(); container.add( mypanel, BorderLayout.CENTER ); container.add( buttonpanel, BorderLayout.SOUTH ); Default ist BorderLayout setsize( 300, 150 ); setvisible( true ); Prof. Dr. Björn Dreher Liste Programmieren - Java 563
CustomPanelTest (fortgesetzt) // execute application public static void main( String args[] ) { CustomPanelTest application = new CustomPanelTest(); application.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); // end class CustomPanelTest Prof. Dr. Björn Dreher Liste Programmieren - Java 564 Ergebnis Prof. Dr. Björn Dreher Liste Programmieren - Java 565