1dvg3 - paint paint ein zeichenprogramm. dvg3 - paint 2 paint – ein zeichenprogramm
TRANSCRIPT
DVG3 - Paint 1
Paint
ein Zeichenprogramm
DV
G3 - P
aint
2
Paint – ein Zeichenprogramm
DV
G3 - P
aint
3
AWT - ImplementierungAWT bietet einheitliche Schnittstelle zu der graphischen Oberfläche auf dem genutzten Rechner. Z.B.:
Windows auf Windows 95/98 und Windows NT
Motif, CDE, fvwm u.s.w. auf UNIX-basierten Rechnern
Vorteile:
einheitliche Programmierschnittstelle
Look & Feel der graphischen Oberfläche entsteht automatisch
Nachteil:
Die JVM hat keine Kontrolle über die eigentliche Darstellung.
AWT kann nur realisieren, was in allen graphischen Oberflächen möglich ist.
DV
G3 - P
aint
4
AWT - Schichtenmodell
Java AWT-Objekt
Peer-Interface
Peer-Implementation
Motif
X11
Peer-Implementation
Win-API
Windows
DV
G3 - P
aint
5
Das Zeichenfenster
DV
G3 - P
aint
6
Öffnen eines FenstersKlasse Framejava.lang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Frame KonstruktorFrame()Frame(String title)Größe und Position festlegensetBounds (int x, int y, int width, int height) (aus Component)sichtbar/unsichtbar machensetVisible (boolean b) (aus Component)Titel ändernsetTitle(String title)Standardfarben definierensetBackground(Color c), setForeground(Color c) (aus Component)Standardfont definierensetFont(Font f) (aus Container)
DV
G3 - P
aint
7
import java.awt.*;
public class Paint extends Frame
{
public static void main(String[] args)
{
new Paint("Paint");
}
Paint (String title)
{
super(title);
setBounds(0,0,400,400);
setVisible(true);
}
}
DV
G3 - P
aint
8
Koordinaten im FrameX-Koordinate : von links nach rechts
Y-Koordinate : von oben nach unten
Linke obere Ecke : (0,0)
Rechte untere Ecke :( getBounds().width , getBounds().height )
public Rectangle getBounds() (aus Component)
Rectangle besitzt die Attribute• int x, int y, int width, int height
Zum Zeichenbereich zählen auch die Ränder, der Kopfbereich und der Menübereich
DV
G3 - P
aint
9
Zeichnen im Framepublic void paint (Graphics g) (aus Container)
standardmäßig ist paint leer und muss überschrieben werden, damit etwas gezeichnet wird
paint ist in Component definiert und damit in allen abgeleiteten Klassen verfügbar
paint wird automatisch aufgerufen, wenn die Graphik aktualisiert werden muss. Z.B.:
Nach Größenänderung des Objektes
Nach wieder sichtbar werden des Objektes
paint kann auch vom Programm direkt oder indirekt (z.B. durch repaint() oder repaintAll()) aufgerufen werden.
paint beginnt immer mit einer leeren Grafik.
Wegen der Implementierung von AWT funktioniert paint aber nicht in allen Klasse gleich gut.
Gut: Frame, Panel, Canvas
Schlecht: Button, Label
DV
G3 - P
aint
10
...Paint (String title){
super(title);setBounds(0,0,400,400);setVisible(true);
}public void paint (Graphics g){
Rectangle b = getBounds();System.out.println("Bounds = "+b);for (int x=1, y=1, w=b.width-2, h=b.height-2;
x<=51 ; x+=10, y +=10, w-=20, h-=20 ){
g.drawRect( x, y, w, h);}
}}
DV
G3 - P
aint
11
Hierarchie von AWT-ObjektenContainer können andere AWT-Objekte aufnehmen. Diese können wieder Container sein. Es entsteht eine Hierarchie von AWT-Objekten.
Frame
Panel
Canvas
TextField
Panel
Panel
Checkbox Checkbox CheckboxCheckboxButton ButtonButton
Button ButtonButton
Button ButtonButton
Button ButtonButton
Scrollbar
Scrollbar
Scrollbar
Label Label
Label Label
DV
G3 - P
aint
12
C h eckb ox
C h eckb ox
C h eckb ox
C h eckb ox
P an e l C an vas TextF ie ld
B u tton
.... ..
B u tton
S c ro llb a r
S c ro llb a r
S c ro llb a r
P an e l
L ab e l
L ab e l
L ab e l
L ab e l
P an e l
F ram e
DV
G3 - P
aint
13
Container - MethodenHinzufügen einer Komponentepublic Component add (Component comp)
Löschen einer Komponentepublic void remove (Component comp)
Löschen aller Komponentenpublic void removeAll ()
Aktualisieren des Containers nach dem Componenten geändert wurdenpublic void validate ()
DV
G3 - P
aint
14
Panel einfügen
Panel hat eigene Koordinaten
Links oben: (0,0)
Rechte untere Ecke :( getBounds().width , getBounds().height )
Panel keinen Rahmen
Panel hat eigenen Clip-Bereich
DV
G3 - P
aint
15
...private GPanel gPanel = new GPanel();Paint (String title){
super(title);setBounds(0,0,400,400);add(gPanel);setVisible(true);
}}class GPanel extends Panel{
public void paint (Graphics g){
Rectangle b = getBounds();System.out.println("Bounds = "+b);for (int x=1, y=1, w=b.width-2, h=b.height-2;
x<=51 ; x+=10, y +=10, w-=20, h-=20 ){
g.drawRect( x, y, w, h);}
}}
DV
G3 - P
aint
16
Anonyme Klassen
Die Definition der Klasse GPanel ist sehr kurz und einfach.
Es wird nur ein Objekt der Klasse GPanel erzeugt.
Definition der Klasse GPanel steht weit weg von der Nutzung.
Nutzung anonymer Klassen vereinfacht das Programm und macht es übersichtlicher und kompakter.
Anonyme Klassen
DV
G3 - P
aint
17
import java.awt.*;public class Paint extends Frame{
public static void main(String[] args) { new Paint("Paint"); }private Panel gPanel = new Panel(){public void paint (Graphics g){
Rectangle b = getBounds();System.out.println("Bounds = "+b);for (int x=1, y=1, w=b.width-2, h=b.height-2;x<=51; x+=10, y +=10, w-=20, h-=20 ){
g.drawRect( x, y, w, h);}
} };Paint (String title){
super(title);setBounds(0,0,400,400);add(gPanel);setVisible(true);
}}
DV
G3 - P
aint
18
Malen in AWTZeichnen einer Freihandkurve
Vorgang:
1. Mouse auf den Anfangspunkt positionieren
2. Linke Mouse-Taste drücken
3. Mouse mit gedrückter Taste bewegen
4. Linke Mouse-Taste loslassen
Diese Vorgänge erzeugen Events.
Events müssen vom Programm behandelt werden.
Events
DV
G3 - P
aint
19
MouseEventDas Ereignis, das bei der Bewegung der Maus und bei Benutzung der der Maustasten eintritt.
Enthalten im package java.awt.event
Methoden:
public int getClickCount()Anzahl der Tastendrücke ( 2=Doppelklick )
public Point getPoint()(x,y)-Koordinate bei der das Ereignis eingetreten istpublic
public int getX()x-Koordinate bei der das Ereignis eingetreten ist
public int getY()y-Koordinate bei der das Ereignis eingetreten ist
public String paramString()Zeichenkette, die das Ereignis beschreibt
DV
G3 - P
aint
20
MouseListener, MouseAdapterListener, der auf Ereignisse reagiert, die beim Drücken einer Maustaste und beim Betreten und Verlassen des Objektes durch den Mauszeiger auftreten.MouseListener ist ein Interface.MouseAdapter implementiert alle Methode von MouseListener durch leere Methoden.Enthalten im package java.awt.eventMethoden:
public void mouseClicked(MouseEvent e)wird aufgerufen, wenn die linke Maustaste gedrückt und wieder losgelassen wirdpublic void mouseEntered(MouseEvent e)wird aufgerufen, wenn der Mauszeiger das Objekt betritt public void mouseExited(MouseEvent e)wird aufgerufen, wenn der Mauszeiger das Objekt verlässtpublic void mousePressed(MouseEvent e)wird aufgerufen, wenn die linke Maustaste gedrückt wirdpublic void mouseReleased(MouseEvent e)wird aufgerufen, wenn die linke Maustaste gedrückt war und wieder losgelassen wird
DV
G3 - P
aint
21
MouseMotionListener, MouseMotionAdapterListener, der auf Ereignisse reagiert, die beim Bewegen der Maus auftreten.
MouseMotionListener ist ein Interface.
MouseMotionAdapter implementiert alle Methode von MouseMotionListener durch leere Methoden.
Enthalten im package java.awt.event
Methoden:
public void mouseDragged(MouseEvent e)wird aufgerufen, wenn die Maus bewegt wird und dabei die linke Maustaste gedrückt ist
public void mouseMoved(MouseEvent e)wird aufgerufen, wenn die Maus bewegt wird ohne dass die linke Maustaste gedrückt ist
DV
G3 - P
aint
22
import java.awt.*;import java.awt.event.*;public class Paint extends Frame implements
MouseListener, MouseMotionListener{
public static void main(String[] args) { new Paint("Paint"); }
private int x0, y0;private Panel gPanel = new Panel();
Paint (String title){
super(title);setBounds(0,0,400,400);add(gPanel);setVisible(true);gPanel.addMouseListener(this);gPanel.addMouseMotionListener(this);
}
DV
G3 - P
aint
23
public void mousePressed(MouseEvent e){
x0 = e.getX();y0 = e.getY();
}public void mouseDragged(MouseEvent e){
int x = e.getX();int y = e.getY();gPanel.getGraphics().drawLine(x0,y0,x,y);x0=x;y0=y;
}
public void mouseClicked(MouseEvent e) { }public void mouseEntered(MouseEvent e) { }public void mouseExited(MouseEvent e) { }public void mouseReleased(MouseEvent e) { }public void mouseMoved(MouseEvent e) { }
}
DV
G3 - P
aint
24
LayoutContainer enthalten AWT-Objekte
Wenn mehrere Objekte enthalten sind, stellt sich die Frage der Anordnung der Objekte, des Layouts.
Die Anordnung der Objekte kann mit Hilfe der Layout-Managers beeinflusst werden.
Alle von Container abgeleiteten Klassen erben die Methodepublic void setLayout(LayoutManager mgr)
LayoutManager ist ein Interface man kann prinzipiell eigene LayoutManager entwickeln.
Vom Interface LayoutManager ist das Interface LayoutManager2 abgeleitet. Mit diesem Interface können kompliziertere Layouts realisiert werden.
In AWT sind einige gebräuchliche Layouts realisiert.
DV
G3 - P
aint
25
Von LayoutManager abgeleitete Layouts
GridLayout
Tabellen-Layout
feste Anzahl von Zeilen und/oder Spalten
Zeilenhöhe und Spaltenbreite gleichmäßig
FlowLayout
fließendes Layout
passt sich der Größe des Fensters an
sortiert die Komponenten automatisch
DV
G3 - P
aint
26
Von LayoutManager2 abgeleitete LayoutsCardLayout
organisiert mehrere Seiten wie Karteikarten
Spezielle Methoden erlauben das Blättern und Positionieren
BorderLayout
Randkomponenten um eine zentrale Komponente platziert
GridBagLayout
Verallgemeinertes Tabellen-Layout
Zusammenfassung von Zellen
Steuerung der Höhen und Breiten
DV
G3 - P
aint
27
Kombination von LayoutsZur Beschreibung komplizierterer Layouts können diese kombiniert werden.
Statt einer Komponente wird ein Container platziert. Dieser Container erhält ein eigenes Layout.
GridLayout
BorderLayout
GridBagLayout
DV
G3 - P
aint
28
Paint-LayoutBorderLayout
File – Operationen
Nachrichten
Zeichenwerkzeuge
Zeichenfläche
Status, Einstellungen
DV
G3 - P
aint
29
private Label xLabel = new Label(" x = ");private Label yLabel = new Label(" y = ");Paint (String title){ super(title);
setBounds(0,0,400,400);setLayout(new BorderLayout());add(gPanel,BorderLayout.CENTER);gPanel.addMouseListener(this);gPanel.addMouseMotionListener(this);createStatus();setVisible(true);
}private void createStatus(){ Panel statusPanel = new Panel();
statusPanel.setBackground(new Color(240,240,240));statusPanel.setLayout(new GridBagLayout());GridBagConstraints gbc = new GridBagConstraints();gbc.gridwidth=GridBagConstraints.REMAINDER;statusPanel.add(xLabel,gbc);statusPanel.add(yLabel,gbc);gbc.weighty=1.0;statusPanel.add(new Label(),gbc);add(statusPanel,BorderLayout.EAST);
}
DV
G3 - P
aint
30
private void showStatus(int x, int y){
xLabel.setText(" x = "+x);yLabel.setText(" y = "+y);
}public void mouseDragged(MouseEvent e){
int x = e.getX();int y = e.getY();gPanel.getGraphics().drawLine(x0,y0,x,y);x0=x;y0=y;showStatus(x, y);
}public void mouseMoved(MouseEvent e){
showStatus(e.getX(), e.getY());}
DV
G3 - P
aint
31
Window schließenDie vorhandenen Schaltflächen und Menüpunkte zum Schließen des Fensters funktionieren standardmäßig nicht.
Die entsprechenden Funktionen müssen erst implementiert werden.
Die Betätigung erzeugt einen WindowEvent.
Die Behandlung erfolgt in einem Objekt das zu einer Klasse gehört, die vom Interface WindowListener bzw. der Klasse WindowAdapter abgeleitet wurde.
DV
G3 - P
aint
32
Methoden des WindowListener, WindowAdapterpublic void windowActivated(WindowEvent e)Das Fenster war nicht aktiv und wird aktiviert.
public void windowClosed(WindowEvent e)Das Fenster wurde geschlossen, indem dispose() für das Fenster aufgerufen wurde.
public void windowClosing(WindowEvent e)Das Fenster wurde geschlossen, indem die entsprechenden Schaltflächen des Fensters betätigt wurden.
public void windowDeactivated(WindowEvent e)Das Fenster war aktiv und ist es nun nicht mehr.
public void windowDeiconified(WindowEvent e)Das Fenster war minimiert (als Icon) dargestellt und wird nun in normaler Größe dargestellt.
public void windowIconified(WindowEvent e)Das Fenster wird minimiert (als Icon) dargestellt.
public void windowOpened(WindowEvent e)Das Fenster wird das erste mal sichtbar gemacht (setVisible(true)).
DV
G3 - P
aint
33
public class Paint extends Frame implementsMouseListener, MouseMotionListener, WindowListener
{Paint (String title){ ...
addWindowListener(this);setVisible(true);
}public void windowClosing(WindowEvent e){
dispose();}public void windowClosed(WindowEvent e){
System.exit(0);}public void windowActivated(WindowEvent e) { }public void windowDeactivated(WindowEvent e) { }public void windowDeiconified(WindowEvent e) { }public void windowIconified(WindowEvent e) { }public void windowOpened(WindowEvent e) { }
DV
G3 - P
aint
34
ButtonsZum Beenden des Programms sollte ein Exit-Button vorhanden sein.Klasse Button abgeleitet von Component.Konstruktoren:
public Button()Knopf ohne Beschriftungpublic Button(String label)Knopf mit Beschriftung
Methoden:public void addActionListener(ActionListener l)public void removeActionListener(ActionListener l) Registrieren bzw. Deregistrieren eines ActionListenerspublic String getLabel()public void setLabel(String label)Lesen bzw. Schreiben der Beschriftungpublic String getActionCommand()public void setActionCommand(String command)Lesen bzw. Setzen des Tastaturkommandos, wenn nicht gesetzt = Label
DV
G3 - P
aint
35
ActionEventEreignis, das bei folgenden Komponenten auftritt:
Button
MenuItem
TextField
List
Methoden:
public String getActionCommand()Liefert das mit dem Objekt in dem der ActionEvent aufgetreten ist verbundene ActionCommand.
public int getModifiers()Modifizierungstasten die beim Eintreten des ActionEvents gedrückt waren
DV
G3 - P
aint
36
ActionListener, ActionAdapterListener der auf ActionEvents reagieren.
Enthält genau eine Methode:public void actionPerformed(ActionEvent e)
Diese Methode wird aufgerufen, wenn ein ActionEvent aufgetreten ist.
DV
G3 - P
aint
37
public class Paint extends Frame implementsMouseListener, MouseMotionListener, WindowListener,ActionListener
{Paint (String title){ ...
createFile();... }private void createFile(){
Panel filePanel = new Panel();filePanel.setBackground(new Color(240,240,240));filePanel.setLayout(new GridBagLayout());Button exitButton = new Button("exit");exitButton.addActionListener(this);filePanel.add(exitButton);add(filePanel,BorderLayout.NORTH);
}public void actionPerformed(ActionEvent e){
dispose();}
DV
G3 - P
aint
38
MenüsZur Beschreibung von Menüs gibt es einen eigene Familie von Klassen. Diese hat als Wurzel die Klasse MenuComponent.
MenuBar
CheckboxMenuItem
PopupMenu
Menu
MenuItem
MenuComponent
Object
DV
G3 - P
aint
39
MenüklassenMenuBarKlasse beschreibt den Menübalken, der mit der Methode setMenuBar der Klasse Frame zum Frame hinzugefügt werden kann.
MenuMenu ist die oberste Menüebene, die ständig am oberen Rand des Frames angezeigt wird. In einem Menü können folgende Menükomponenten angezeigt werden:
MenuItem
CheckboxMenuItem
Menu ( Untermenü)
Menu, MenuItem und CheckboxMenuItem reagieren auf ActionEvents.
CheckboxMenuItem reagiert auf ItemEvents.
Wenn bei einem Menu ein Listener registriert wird, reagiert er auf alle Events die bei den MenuItems und CheckboxMenuItems die in dem Menu enthalten sind auftreten.
DV
G3 - P
aint
40
Zu einem MenuItem kann ein Shortcut definiert werden. Dieser wird dann im Menü angezeigt. Es wird immer eine systemabhängige Modifikationstaste dazudefiniert. Z.B.: <Ctrl> bei Windows und Motif
Konstruktoren
public Menu(String label)
public MenuItem(String label)
public MenuItem(String label, MenuShortcut s)
public CheckboxMenuItem(String label)
public CheckboxMenuItem(String label, boolean state)
new MenuItem("-") erzeugt im Menü einen Trennstrich
DV
G3 - P
aint
41
Paint (String title){ ...
MenuBar menu = new MenuBar();setMenuBar(menu);createFile(menu);
... }private void createFile(MenuBar menu){
Menu fileMenu = new Menu("File");menu.add(fileMenu);fileMenu.addActionListener(this);fileMenu.add(new MenuItem("exit",
new MenuShortcut('e')));Panel filePanel = new Panel();filePanel.setBackground(new Color(240,240,240));filePanel.setLayout(new GridBagLayout());Button exitButton = new Button("exit");exitButton.addActionListener(this);filePanel.add(exitButton);add(filePanel,BorderLayout.NORTH);
}