11.4. Zeichnen

Werbung
11. GUI-Programmierung mit SWING
Überblick
11.1
11.2
11.3
11.4
11.5
11.6
11.7
Einführung
Einfache Swing Komponenten
Ereignisbehandlung und Adapterklassen
Zeichnen
Dialoge
Layout Manager
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
11.4.2
11.4.3
Subklasse von JPanel
Anwendung
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
549
1
11. SWING: 11.4. Zeichnen
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. SWING: 11.4. Zeichnen
11.4.1 Der Java graphische Kontext
„
Koordinatensystem
+x
(0, 0)
x-Achse
(x, y)
+y
‰
‰
y-Achse
Ausgangspunkt: Linke obere Ecke
Einheit: Pixel
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
551
2
11. SWING: 11.4. Zeichnen
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
11.4.2 Subklasse von JPanel
11.4.3
Anwendung
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
553
3
11. SWING: 11.4. Zeichnen
11.4.2 Subklasse von JPanel
„
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()
‰
© Prof. Dr. Björn Dreher
Bittet Swing, die Komponente bei nächster Gelegenheit sich zeichnen
zu lassen
Liste Programmieren - Java
554
11. SWING: 11.4. Zeichnen
11.4.2 Subklasse von JPanel
„
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
4
11. SWING: 11.4. Zeichnen
11.4.2 Subklasse von JPanel
„
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
11. SWING: 11.4. Zeichnen
11.4.2 Subklasse von JPanel
„
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()
‰
‰
© Prof. Dr. Björn Dreher
Methode update() von Component wird aufgerufen
ƒ
Löscht Hintergrund der Komponente
Ruft ihrerseits Methode paint()
Liste Programmieren - Java
557
5
11. SWING: 11.4. Zeichnen
11.4.2 Subklasse von JPanel
„
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
11.4.2 Subklasse von JPanel
11.4.3 Anwendung
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
559
6
11. SWING: 11.4. Zeichnen
11.4.3 Anwendung
„
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
11. SWING: 11.4. Zeichnen
11.4.3 Anwendung
„
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
7
11. SWING: 11.4. Zeichnen
11.4.3 Anwendung
„
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
11. SWING: 11.4. Zeichnen
11.4.3 Anwendung
„
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
8
11. SWING: 11.4. Zeichnen
11.4.3 Anwendung
„
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
11. SWING: 11.4. Zeichnen
11.4.3 Anwendung
„
Ergebnis
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
565
9
Herunterladen