Lektion 4: Dialogprogrammierung und Graphik Helmar Burkhart Informatik Universität Basel [email protected] Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-0 Übersicht Lektion 4 • Grundprinzipien von Graphik und Dialog • AWT-Graphik • Turtle-Graphik • Komponenten und Behälter • Swing Prinzipien • Ereignisbehandlung • Layout- und Plattformsichten Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-1 Hoffentlich ein Volltreffer Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-2 Übersicht und Geschichte • Graphik- und Dialogelemente haben sich im Laufe der letzten Jahre stark verändert. • Java 1.0 -> 1.1: Neue Ereignisbehandlung • AWT (Abstract Windows Toolkit) • Swing • JFC (Java Foundation Classes) Wir geben einen Einstieg in die Techniken. Die vorhandenen Klassenpakete sind umfangreich ! Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-3 Graphik Template (1) Das folgende Muster dient vorerst als Schablone zum Erzeugen einer Graphikausgabe. Importieren der Pakete für Graphik und Dialog import java.awt.*; import java.awt.event.*; import javax.swing.*; xyz ist jeweils zu setzen public class xyz{ public static void main(String args[]) { JFrame f = new xyzFrame(); f.show(); } } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-4 Graphik Template (2) class xyzFrame extends JFrame{ public xyzFrame(){ Fenstertitel setTitle("xyz Text"); Fenstergrösse setSize(220,250); addWindowListener( new WindowAdapter(){ public void windowClosing (WindowEvent e){ System.exit(0);} } ); Container contentPane = getContentPane(); contentPane.add( new xyzPanel() ); } } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-5 Graphik Template (3) class xyzPanel extends JPanel{ public void paintComponent(Graphics g){ super.paintComponent(g); g.fillArc(0, 0, 200, 200, 0, 360 ); } } Zeichenoperationen einsetzen Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-6 AWT Graphik • java.awt.Graphics ist eine Klasse zum Erzeugen graphischer Objekte: Linien, Rechtecke, Kreise,... drawRect(int x, int y, int breite, int hoehe) (0,0) x-Werte (x,y) breite hoehe y-Werte Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-7 Graphics Methoden • Linie: drawLine(...) • Rechteck: drawRect(...) • Gefülltes Rechteck: fillRect(...) • Ellipse: drawOval(...) • Bogen: drawArc(...) • Gefüllter Bogen: fillArc(...) • Polygon: drawPolygon(...) • Text: drawString(...) Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-8 xyz = Schnabel public void paintComponent(Graphics g){ super.paintComponent(g); int r = 150; // Kreisradius int cx = 250; // Kreiszentrum int cy = 300; int angle = 30; // Halber Oeffnungswinkel int dx =(int)(r*Math.cos(angle * Math.PI / 180)); int dy = (int)(r*Math.sin(angle * Math.PI / 180)); g.drawLine(cx, cy, cx + dx, cy + dy); g.drawLine(cx, cy, cx + dx, cy - dy); g.drawArc(cx - r, cy - r, 2 * r, 2 * r, angle, 360 - 2 * angle); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-9 Farbe • java.awt.Color unterstützt das Arbeiten mit Farbe. • Farbe mittels RGB-Wert spezifizierbar. • Standardfarben mittels Bezeichner Color.gray Color.blue Color.pink Color.red Color.cyan Institut für Informatik Universität Basel Color.yellow Color.green Color.magenta Color.orange Color.white EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-10 xyz = FillCircles (1) public void paintComponent(Graphics g){ super.paintComponent(g); int r = 250; // Kreisradius int cx = 380; // Kreiszentrum int cy = 280; Color c =Color.white; for (int i=0; i<30; i++){ switch(i%10){ case 0: c=Color.gray;break; case 1: c=Color.blue;break; case 2: c=Color.pink;break; case 3: c=Color.red;break; Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-11 xyz = FillCircles (2) case 4: c=Color.cyan;break; case 5: c=Color.yellow;break; case 6: c=Color.green;break; case 7: c=Color.magenta;break; case 8: c=Color.orange;break; case 9: c=Color.white;break; } g.setColor(c); g.fillArc(cx - r, cy - r, 2 * r, 2 * r, 0, 360 ); r-=10; } } } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-12 Klasse java.awt.Polygon • Es gibt eine Klasse java.awt.Polygon • Konstruktor für leeres Polygon bzw. aus Felder von x und y Werten. • Methode addPoint() fügt neuen Punkt am Polygon an. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-13 xyz = DrawPoly Polygon p = new Polygon(); cx = 600; int i; for (i = 0; i < 5; i++) p.addPoint( (int)(cx + r * Math.cos(i * 2 * Math.PI / 5)), (int)(cy + r * Math.sin(i * 2 * Math.PI / 5))); g.drawPolygon(p); } } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-14 Turtle Graphik Turtle Graphik ist ein einfaches Modell zum Erlernen von Graphik (im Kindergartenalter). • Es gibt eine "Schildkröte", die einen Zeichenstift besitzt. • Die Schildkröte läuft immer in eine Richtung; diese kann aber durch Links- bzw. Rechtsdrehen geändert werden. • Die gegenwärtige Richtung kann gespeichert werden. • Die gegenwärtige Position kann gespeichert werden. • Erweiterungen: Farbstifte, Stift hoch/tief Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-15 Turtle Graphik Routinen (1) class TurtleGraphics{ Point pos; // Position double dir =0; // Initialrichtung nach rechts Graphics turtle; TurtleGraphics(Graphics g, int xpos, int ypos) TurtleGraphics(Graphics g) Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-16 Turtle Graphik Routinen (2) void move(double dist) void turnLeft(double ang) void turnRight(double ang) Point getPenPos() void setPenPos(Point p) double getPenDir() void setPenDir(double w) void setPenColor(Color c) Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-17 Wir erzeugen folgende Spirale Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-18 Turtle Spirale public void paintComponent(Graphics g){ super.paintComponent(g); TurtleGraphics tg = new TurtleGraphics(g,100,100); double dist = 400; while (dist >0){ tg.move(dist); tg.turnRight(90); dist-=10; } } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-19 Jetzt sind Sie dran ! Wie kommt man wieder heraus ? Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-20 Welche Ausgabe wird erzeugt ? public void paintComponent(Graphics g){ super.paintComponent(g); TurtleGraphics tg = new TurtleGraphics(g,350,250); double dist=5; tg.setPenColor(Color.blue); while (dist<=150){ tg.move(dist); tg.turnRight(30); dist+=0.5; } } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-21 Jetzt wird's schwieriger: Rekursion public void paintComponent(Graphics g){ super.paintComponent(g); TurtleGraphics tg = new TurtleGraphics(g,300,300); fac = 0.5 tg.turnLeft(90); draw(tg,128); } private void draw(TurtleGraphics tg, double s){ if (s<1) return; Point p = tg.getPenPos(); double w = tg.getPenDir(); tg.turnLeft(45); tg.move(s); draw(tg,fac*s); tg.setPenPos(p); tg.setPenDir(w); tg.turnRight(45); tg.move(s); draw(tg,fac*s); } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-22 Aufgaben beim GUI-Programmieren Die Programmierung der graphischen Benutzerschnittstelle (Graphical User Interface = GUI) umfasst folgende Unteraufgaben: • Die Definition des logischen Aufbaus der Schnittstelle, d.h. die Einbettung der Dialogkomponenten. • Die Definition der Ereignisbehandlung, d.h. die Festlegung der Aktionen. • Die Definition der allgemeinen Gestaltung, d.h. insbesondere der Platzierungsregeln (layout management). • Die Definition des spezifischen Aussehens (Plattformsicht). Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-23 Programmabbruch auf die unfeine Art Was passiert, wenn wir xyzFrame "vereinfachen" ? class xyzFrame extends JFrame{ public xyzFrame(){ setTitle("xyz Text"); setSize(220,250); /* addWindowListener(........); */ Container contentPane = getContentPane(); contentPane.add(new xyzPanel() ); } } Fenster schliesst Anwendung per <ctrl> c abbrechen Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-24 Komponenten und Behälter • Komponenten (component) und Behälter (container) definieren den logischen Aufbau der graphischen Benutzerschnittstelle. • Komponenten sind GUI-Elemente, die auf dem Bildschirm dargestellt und umplaziert werden können, und die Ereignisse auslösen, empfangen und behandeln. Bsp.: Knopf (button), Menü (menu), Rollbalken(scrollbar). • Behälter sind GUI-Elemente, die andere Komponenten beinhalten können. Bsp.: Fenster (window, frame), Leiste (panel) Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-25 Hierarchischer Aufbau des GUI Behälter Komponenten Anordnung Aktionen Knopf A Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-26 Vererbungshierarchie AWT und Swing java.lang.Object java.awt.event.* java.awt.Component java.awt.layout java.awt.Container javax.swing.JComponent javax.swing.JPanel javax.swing.JButton Java.awt.Graphics java.awt.Window java.awt.Frame javax.swing.JFrame ... Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-27 Ereignisbehandlung • Interaktive Programme sind Programme, deren Ablauf auf ständige Benutzereingaben ausgerichtet ist. • Die Ereignisbehandlung sorgt dafür, dass Reaktionen auf Benutzereingaben erfolgen (vgl. Informatik I, Lektion 9). Fenster verschieben oder schliessen Knopf drücken Menü auswählen Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-28 Ereignisorientiertes Programmieren Beim ereignisorientierten Programmieren ist der Programmablauf verteilt: Benutzereingabe: Taste drücken Aufruf der Ereignisbehandlung Ereignisreaktion Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik Ereignisbehandler wird aufgerufen Ereignisbehandlung reagiert: Fenster schliessen 4-29 Ereignisbehandlung Die Ereignisbehandlung ist in Java seit Version 1.1 vereinheitlicht. Prinzip: Die Ereignisbehandlung wird der Komponente hinzugefügt, die auf die Benutzereingabe reagieren soll. Beispiel: Fenster schliessbar machen. • WindowListener ist ein Interface des Pakets java.awt.event. • 7 abstrakte Methoden darunter windowClosing() • addWindowListener(WindowListener l) Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-30 Klasse xyzWindowListener class xyzWindowListener implements WindowListener{ public void windowClosing(WindowEvent e){System.exit(0);} public public public public public public void void void void void void windowActivated(WindowEvent e){} windowClosed(WindowEvent e){} windowDeactivated(WindowEvent e){} windowDeiconified(WindowEvent e){} windowIconified(WindowEvent e){} windowOpened(WindowEvent e){} } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-31 xyzFrame mit Ereignisbehandlung class xyzFrame extends JFrame{ public xyzFrame(){ setTitle("xyz Text"); setSize(220,250); addWindowListener(new xyzWindowListener()); } Neuen Ereignisbehandler erzeugen und dem JFrame hinzufügen Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-32 Adapterklassen • Das Implementieren einer Schnittstelle ist mühsam, wenn man nur 1 Methode implementieren will. • Adapterklassen sind eine "leere" Implementierung der Listenerklasse. • Man kann von der Adapterklasse ererben und nur die gewünschte Methode überschreiben. class xyzWindowListener extends WindowAdapter{ public void windowClosing(WindowEvent e){System.exit(0);} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-33 Lokale, innere Klasse Ein WindowListener wird nur im Kontext eines Fensters angewendet → Lokalität durch innere Klasse. class xyzFrame extends JFrame{ public xyzFrame(){ Klasse wird innerhalb eines Anweisungsblocks definiert. Nur im entsprechenden Block bekannt. class xyzWindowListener extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0);} } addWindowListener( new xyzWindowListener()); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-34 Elegante Lösung: Anonyme Klasse class xyzFrame extends JFrame{ Definition einer public xyzFrame(){ namenlosen Klasse abgeleitet von setTitle("xyz Text"); WindowAdapter und setSize(220,250); erzeugen eines Objekts. addWindowListener( new WindowAdapter(){ public void windowClosing (WindowEvent e){ System.exit(0);} } ); } } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-35 Toolkit • Java zielt auf plattformunabhängiges Programmieren. Um eine Anwendung systemneutral zu schreiben braucht man manchmal aber Information über das System, z.B. die Bildschirmauflösung. • Die Klasse java.awt.Toolkit dient hier als Bindeglied. Toolkit tk = Toolkit.getDefaultToolkit(); Dimension d = tk.getScreenSize(); System.out.println(“Hoehe: "+d.height+ " Breite: "+d.width); Hoehe: 768 Breite: 1024 Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-36 CenteredFrame und CloseableFrame Paket frames aufbauen mit 2 Hilfsklassen, die alles verstecken, was man ständig an Funktionalität will. • CenteredFrame extends JFrame: Erzeugt ein Fenster, das in der Bildschirmmitte platziert wird. Verschiedene Konstruktoren betreffend der Grösse. • CloseableFrame extends CenteredFrame: Macht Fenster schliessbar. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-37 Aufbau eines JFrame Ein JFrame Behälter ist ein strukturiertes Objekt, das mehrere übereinandergelagerte Ebenen umfasst. Wir arbeiten hier nur mit der Inhaltsebene (content pane). Gibt Referenz auf Inhaltsebene zurück Container contentPane = getContentPane(); contentPane.add( new xyzPanel() ); Der Inhaltsebene wird eine andere Komponente (hier Leiste) hinzugefügt. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-38 Allgemeines GUI Template (1) Importieren der Pakete für Graphik und Dialog import import import import java.awt.*; java.awt.event.*; javax.swing.*; frames.*; Importieren des eigenen Pakets für Fenster. class xyzGUIFrame extends CloseableFrame{ ... Hier wird das eigentliche GUI definiert. } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-39 Allgemeines GUI Template (2) public class xyz{ public static void main(String args[]) { JFrame f = new xyzGUIFrame(); f.show(); } Fenster sichtbar machen. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-40 Knöpfe und Leisten (1) Wir zeigen am Beispiel von Knöpfe und Leisten das prinzipielle Vorgehen bei der GUI Gestaltung. JButton: Knopf der textuell beschriftet oder multmedial gestaltet werden kann. JPanel: Leiste auf der Komponenten platziert werden können. Default-Platzierung ist Aneinanderreihung (FlowLayout). Beispiel: Wir erzeugen Knöpfe und platzieren diese in eine Leiste. Die Leiste selber liegt in einem Fenster. Die Knöpfe reagieren beim Drücken, z.B. Setzen von Hintergrundfarbe. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-41 Knöpfe und Leisten (2) Konstruktoren: • JButton(String text) • JPanel() Ereignisbehandlung: • interface ActionListener • public void actionPerformed(ActionEvent event) • interface ContainerListener • public void componentAdded(...) • public void componentRemoved(...) Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-42 Button1 (1) class Button1GUIFrame extends CloseableFrame{ class ButtonListener implements ActionListener{ public void actionPerformed(ActionEvent event){ System.out.println("Knopf gedrueckt!");} } Button1GUIFrame(){ setTitle("Test auf Reaktion eines Knopfs"); ActionListener actListener = new ButtonListener(); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-43 Button1 (2) p = new JPanel(); yellowbutton = new JButton("gelb"); yellowbutton.addActionListener(actListener); p.add(yellowbutton); orangebutton = new JButton("orange"); orangebutton.addActionListener(actListener); p.add(orangebutton); Container contentPane = getContentPane(); contentPane.add(p);} private JPanel p; private JButton yellowbutton; private JButton orangebutton; } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-44 Button2 "Mehrfachvererbung" in Java class Button2GUIFrame extends CloseableFrame implements ActionListener{ ... yellowbutton.addActionListener(this); ... public void actionPerformed(ActionEvent event) { System.out.println("Knopf gedrueckt!"); } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-45 Button3 Spezifisches Reagieren auf Ereignis. getActionCommand liefert Knopfbeschriftung zurück. public void actionPerformed(ActionEvent event) { String arg = event.getActionCommand(); if ("gelb".equals(arg)) System.out.println("Knopf GELB gedrueckt!"); else if ("orange".equals(arg)) System.out.println("Knopf ORANGE gedrueckt!"); } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-46 Button4 Wie Button3, aber wir setzen den Farbhintergrund der Leiste mittels setBackground(Color c). public void actionPerformed(ActionEvent event) { String arg = event.getActionCommand(); if ("gelb".equals(arg)) p.setBackground(Color.yellow); else if ("orange".equals(arg)) p.setBackground(Color.orange); repaint(); } Aufforderung zum Auffrischen. Auch bei Graphik. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-47 Button5 getSource() liefert direkte Referenz auf die Komponente, die das Ereignis ausgelöst hat. public void actionPerformed(ActionEvent event){ Object source = event.getSource(); if (source == yellowbutton) p.setBackground(Color.yellow); else if (source == orangebutton) p.setBackground(Color.orange); repaint();} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-48 Button6 Bei vielen einheitlichen Knöpfen wird das Programm durch Einführen von Hilfsmethoden klarer: getColors(), defineButton public void actionPerformed(ActionEvent event) { String arg = event.getActionCommand(); Color c= getColors(arg); p.setBackground(c); repaint();} private void defineButton(String str){ JButton button = new JButton(str); button.setBackground( getColors(str)); button.addActionListener(this); p.add(button);} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-49 Button7 Die Inhaltsebene eines JFrame hat BorderLayout als Darstellungsformat. Es werden 2 Leisten generiert und platziert. Container contentPane = getContentPane(); contentPane.add("North", p); pc = new JPanel(); contentPane.add("Center", pc); ... pc.setBackground(c); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-50 Dialogkomponenten Dialogkomponenten in Swing (wie auch bei AWT) werden in 4 Schritten behandelt: • Deklaration einer Referenzvariablen für die Komponente. • Erzeugen eines neuen Komponentenobjekts und Zuweisen an die Referenzvariable. • Ereignisbehandlung für die Komponente definieren. • Einfügen der Komponente in einen Behälter. JButton yellowbutton = new JButton("gelb"); yellowbutton.addActionListener(this); p.add(yellowbutton); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-51 Dialogbehälter Dialogbehälter in Swing (wie auch bei AWT) werden in 2-5 Schritten behandelt: • Deklaration einer Referenzvariablen für den Behälter. • Erzeugen eines neuen Behälterobjekts und Zuweisen an die Referenzvariable. • Eventuell Ereignisbehandlung für den Behälter definieren. • Eventuell Anordnung für den Behälter definieren. • Eventuelles Einfügen in einen Behälter. Bsp. Knopf (JButton) in Leiste (JPanel) platzieren. Jeder Knopfdruck wird in einer Textmarke (JLabel) mitgezählt. Knopfdruck entweder via Maus oder von Tastatur. Beide Leisten in Rahmen (JFrame) legen. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-52 Knopfdruck zählen (1) p1 = new JPanel(); JButton button=new JButton("Drück mich"); button.setMnemonic(KeyEvent.VK_I); button.addActionListener(this); p1.add(button); p2 = new JPanel(); label= new JLabel(labelPrefix + "0 "); p2.add(label); Container contentPane = getContentPane(); contentPane.add("North", p1); contentPane.add("South", p2); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-53 Knopfdruck zählen (2) public void actionPerformed(ActionEvent event) { numClicks++; label.setText(labelPrefix+numClicks); } private JPanel p1,p2; private JLabel label; private String labelPrefix = "Anzahl Tastendrücke: "; private int numClicks = 0; Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-54 Vererbungshierarchie AWT und Swing java.lang.Object java.awt.event.* java.awt.Component java.awt.layout java.awt.Container JComponent JPanel Java.awt.Graphics Window Frame Dialog JFrame JDialog ... JButton JLabel Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-55 JComponent javax.swing.JComponent AbstractButton JButton JComboBox JMenuItem JMenu JLabel JToggleButton JCheckbox JList JRadioButton JMenuBar JTextComponent JOptionPane JTextField JTextArea JPanel JScrollbar Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-56 Menü und Verwandte • Das Erzeugen von Menüs erfolgt hierarchisch. • Die Menüleiste (JMenuBar) wird im Rahmen verankert. • Die einzelnen Menüs (JMenu) werden der Reihe nach in der Leiste platziert. • Innerhalb des Menüs werden der Reihe nach die einzelnen Menüeinträge (JMenuItem) aufgereiht. • Die Menüeinträge können durch eine Trennkomponente strukturiert werden. • Sowohl das Menü wie die Elemente können durch Auswahl mit der Maus oder Tastenmnemonics aktiviert werden. • Jeder Menüeintrag erhält einen Ereignisbehandler. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-57 Menü-Beispiel (1) JMenuBar mb = new JMenuBar(); setJMenuBar(mb); JMenu dateiMenu = new JMenu("Datei"); dateiMenu.setMnemonic('D'); JMenuItem neuItem = new JMenuItem("Neu... Strg+N", 'N'); neuItem.addActionListener(this); dateiMenu.add(neuItem); JMenuItem speichernUnterItem = new JMenuItem("Speichern unter...", 'u'); speichernUnterItem.addActionListener(this); dateiMenu.add(speichernUnterItem); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-58 Menü-Beispiel (2) dateiMenu.addSeparator(); JMenuItem druckenItem = new JMenuItem("Drucken... Strg+P",'r'); druckenItem.addActionListener(this); dateiMenu.add(druckenItem); mb.add(dateiMenu); } public void actionPerformed( ActionEvent event){ String arg = event.getActionCommand(); } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-59 Übersichtliche Menügestaltung • Da die Menüleiste meist einige Menüs mit etlichen Einträgen umfasst und der Aufbau jeweils der gleiche ist, kann mit Hilfe von Hilfsmethoden eine übersichtlichere Darstellung gewonnen werden. • makeMenu: Eigene Hilfsmethode, die jeweils ein neues Menü mit Einträgen erstellt, die sich die gleiche Ereignisbehandlung teilen. • Erzeugen von Untermenüs wird unterstützt. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-60 Menüerzeugung mit Hilfsmethode (1) private static JMenu makeMenu( String name, char mnem, Object [] items, ActionListener al){ JMenu m = new JMenu(name); m.setMnemonic(mnem); JMenuItem mi=null; for (int i= 0; i<items.length; i++){ if (items[i]==null) m.addSeparator(); else { if (items[i] instanceof String){ mi =new JMenuItem( (String)items[i]); if (items[++i]!="") mi.setMnemonic(((String)items[i]). charAt(0)); } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-61 Menüerzeugung mit Hilfsmethode (2) else mi=(JMenuItem)items[i]; mi.addActionListener(al); m.add(mi); } } return m; } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-62 Menüerzeugung mit Hilfsmethode (3) JMenuBar mb = new JMenuBar(); setJMenuBar(mb); mb.add (makeMenu("Datei", 'D', new Object[]{"Neu... Strg+N", "Oeffnen...", "Speichern", "Speichern unter...", null, "Drucken... Strg+P", "Seitenansicht", "Seiteneinrichtung", null, "Beenden", }, this)); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik "N", "f", "S", "u", "r", "c", "", "B" 4-63 Menüerzeugung mit Hilfsmethode (4) mb.add(makeMenu("Ansicht", 'A', new Object[]{ "Liste", "", "Details", "", makeMenu("Symbole anordnen", 'm', new Object []{ "nach Name", "", "nach Typ", "", "nach Datum", "", null, "Automatisch Anordnen", ""}, this) }, this)); } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-64 Weitere Dialogkomponenten • • • • • • • • Texteingabefeld: Texteingabebereich: Rollbalken: Kontrollkästchen: Dateiauswahl: Farbauswahl: Auswahlliste: Tabellen: Institut für Informatik Universität Basel JTextField JTextArea JScrollBar JCheckBox JFileChooser JColorChooser JList JTable EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-65 Ereignisbehandlung - Übersicht (1) Schnittstelle Methode Ereignis Urheber WindowListener windowClosing windowOpened ... WindowEvent Window ActionListener actionPerformed ActionEvent getActionCommand getModifiers Button List MenuItem Textfield ItemListener itemStateChanged ItemEvent Checkbox Choice TextListener textValueChanged TextEvent TextComponent Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-66 Ereignisbehandlung - Übersicht (2) Schnittstelle Methode Ereignis Urheber KeyListener keyTyped KeyEvent Component MouseListener mousePressed MouseEvent Component getx gety MouseEvent Component MouseMotionListener mousemoved .... Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-67 Komponentenanordnung (1) Die Komponentenanordnung wird mit Hilfe von LayoutManager definiert. • FlowLayout: Aneinanderreihung von links nach rechts. • BorderLayout: Anordnung mittels NEWS-Schema. North West Center East South Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-68 Komponentenanordnung (2) • GridLayout: Starres zweidimensionales Gitter • Gridbag-Layout: Flexibles zweidimensionales Gitter • Es können eigene Layout-Manager entwickelt werden. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-69 Plattformaussehen Swing erlaubt plattformspezifische Sichten der Dialogumgebung: • Windows • Motif • Metal (Java look and feel) UIManager.setLookandFeel(plattformName); Swing.Utilities.updateComponentTreeUI(getParent()); Muss in try-catch Teil stehen Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-70 Programme Lektion 4 Graphik Template Schnabel FillCircles DrawPoly Turtle Graphik Routinen Turtle Beispiel 1 Turtle Beispiel 2 Turtle Beispiel 3 Turtle Beispiel 4 Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik (4-4 bis 4-6) (4-9) (4-11/12) (4-14) (4-16/17) (4-19) (4-20) (4-21) (4-22) 4-71 Programme Lektion 4 (Forts.) NotCloseable Closeable1 Closeable2 Closeable3 Toolkit Institut für Informatik Universität Basel (4-24) (4-31/32) (4-33) (4-34) (4-36) Button1 Button2 Button3 Button4 Button5 Button6 Button7 (4-43/44) (4-45) (4-46) (4-47) (4-48) (4-49) (4-50) EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik 4-72 Programme Lektion 4 (Forts.) Knopfdruck zählen Menü-Beispiel 1 Menüerzeugung mit Hilfsmethoden Komponentenanordnung Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 4: Dialogprogrammierung und Graphik (4-53) (4-58/59) (4-61/64) (4-69) 4-73