Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag Einführung in die Programmierung mit Java 14. Vorlesung WS-03/04 Die letzte Hausaufgabe Erweitern des Malprogramms Schreib, eine Toolbar für Rechtecke, die das Selbe macht, wie die ToolBar für Ellipsen aus der Vorlesung. (Folie 26 – 32) Hinweis: Hierfür müsst ihr eine extra Klasse Rechteck schreiben, welche das Interface GrafikObjekt implementiert. IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 2 Die letzte Hausaufgabe import java.awt.*; class Rechteck implements GrafikObjekt { // Attribute der Klasse Rechteck int x, y, breite, hoehe; Color farbe; // Konstruktor der Klasse Rechteck public Rechteck ( int x, int y, int breite, int hoehe) { this.x = x; this.y = y; this.breite = breite; this.hoehe = hoehe; this.farbe = Color.BLACK; } public void zeichnen_auf( Graphics2D g2d) { g2d.setColor( farbe); g2d.drawRect( x, y, breite, hoehe); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 3 Die letzte Hausaufgabe import java.awt.*; Methode des Quellcode Ergänzungen import java.util.*; Buttons zeichnen import javax.swing.*; siehe letzte Vorlesung: public class Smile extends JFrame { die Ellipsentoolbar private Leinwand display; ... private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { int x = Integer.parseInt( jTextfield5.getText()); int y = Integer.parseInt( jTextfield6.getText()); int breite = Integer.parseInt( jTextfield7.getText()); int hoehe = Integer.parseInt( jTextfield8.getText()); 1. den Button mit einer Methode versehen ! 2. die Methode mit Anweisungen füllen ! GraphikObjekt go = new Rechteck( x, y, breite, hoehe); display.grafik_objekt_hinzufuegen( go); this.repaint(); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 4 Mein Malprogramm Smile+ IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 5 GUI-Dialoge IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 6 Beispiel IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 7 Beispiel IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 8 GUI-Dialoge anlegen ! Achtung ! es entsteht eine extra Quellcodedatei Die neue Klasse soll Farbwahl heißen !! Bei Forte gilt: Dialoge können als eigenständige Programme gestartet werden typische Aufgabe: Abfragen von Benutzereingaben IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 9 Den GUI-Dialog integrieren 1. Ein Menüpunkt zum Starten des Dialoges anlegen IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 10 Den GUI-Dialog integrieren 1. Ein Menüpunkt zum Starten des Dialoges anlegen 2. Den Menüpunkt über Events -> Action -> actionPerformed eine Methode zuordnen IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 11 Den GUI-Dialog integrieren 1. Ein Menüpunkt zum Starten des Dialoges anlegen 2. Den Menüpunkt über Events -> Action -> actionPerformed eine Methode zuordnen Die Klasse des Dialogs == Dialogtyp 3. Die Methode ergänzen public class Smile extends JFrame { ... private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: Farbwahl wahl = new Farbwahl( this, true); wahl.show(); ... ein Dialog möchte immer wissen wem er gehört ! } ... ein Dialog starten und anzeigen } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 12 GUI - Dialoge modal oder nicht public class Smile extends JFrame { ... private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: Farbwahl wahl = new Farbwahl( this, true); wahl.show(); ... hier wird festgelegt ob der Dialog modal ist oder nicht } ... } modal = der Eigentümer des Dialogs wartet, bis dieser beendet wird und startet erst dann mit den nächsten Anweisungen typisches Beispiel: Formatauswahl bei PowerPoint & Co nicht modal = der Eigentümer des Dialogs wartet nicht, bis dieser beendet wird. Der Eigentümer kann parallel zum Dialog weiter genutzt werden. typisches Beispiel: Toolbars, z.B. Ellipsentoolbar IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 13 JDialog + JColorChooser einen Dialog zur Farbwahl gestalten IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 14 JDialog + JColorChooser einen Dialog zur Farbwahl gestalten JButton JSeparator JButton JPanel mit GridLayout (cols: 3; rows: 1) IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 15 einen Dialog zur Farbwahl die Auswahl bestätigen 1. Dem Button über Events -> Action -> actionPerformed eine Methode zuordnen import javax.swing.*; import java.awt.*; public class Farbwahl extends JDialog { static public Color farbe = Color.BLACK; ... private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: die ausgewählte Farbe merken farbe = jColorChooser1.getColor(); setVisible( false); dispose(); den Dialog unsichtbar machen } ... und den Eigentümer freigeben private JColorChooser jColorChooser1; } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 16 einen Dialog zur Farbwahl die Auswahl abbrechen 1. Dem Button über Events -> Action -> actionPerformed eine Methode zuordnen import javax.swing.*; import java.awt.*; public class Farbwahl extends JDialog { static public Color farbe = Color.BLACK; ... private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: setVisible( false); dispose(); } ... } den Dialog unsichtbar machen und den Eigentümer freigeben IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 17 Den Dialog nutzen den neuen Ellipsen die gewählte Farbe geben import java.awt.*; Quellcode Ergänzungen import java.util.*; import javax.swing.*; siehe letzte Vorlesung: public class Smile extends JFrame { die Ellipsentoolbar private Leinwand display; ... private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int x = Integer.parseInt( jTextfield1.getText()); int y = Integer.parseInt( jTextfield2.getText()); int breite = Integer.parseInt( jTextfield3.getText()); int hoehe = Integer.parseInt( jTextfield4.getText()); Ellipse go = new Ellipse( x, y, breite, hoehe); go.farbe_setzen( Farbwahl.farbe); display.grafik_objekt_hinzufuegen( go); this.repaint(); Methode des Buttons zeichnen möglich, da farbe statisch ist ! } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 18 Das Klassenattribut farbe 1. Dem Button über Events -> Action -> actionPerformed eine Methode zuordnen import javax.swing.*; import java.awt.*; public class Farbwahl extends JDialog { static public Color farbe = Color.BLACK; ... Dieses Attribut ist nicht an ein Objekt sondern an private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { die Klasse // Add your handling code here: gekoppelt ( Klassenattribut ). setVisible( false); dispose(); } ... Daher, sobald diese Klasse importiert/verfügbar wird ist es ebenso verfügbar ! Abrufbar über: Farbwahl.farbe } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 19 Dialog zum Strichart ändern IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 20 Dialog zum Strichart ändern (Klasse BS_Dialog extends JDialog) Dialogoberfläche mit GridLayout rows:4 cols:2 JTextField JLabel JComboBox JButton bekommen Methoden über Events Action actionPerformed IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 21 javax.swing.JComboBox Auswahllisten Ausgewähltes Element Liste der verfügbaren Elemente Auswahl 0 Auswahl 1 Auswahl 2 ... Knopf zum Öffnen der Auswahl JComboBox Jedes Element der Liste hat einen Index (von 0 bis n-1) IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 22 javax.swing.JComboBox Auswahllisten Der Liste der verfügbaren Elemente (=Items) ein Element hinzufügen : JComboBox meine_auswahl = new JComboBox(); meine_auswahl.addItem(“Auswahl 0“); meine_auswahl.addItem(“Auswahl 1“); meine_auswahl.addItem(“Auswahl 2“); Auswahl 0 Auswahl 1 Auswahl 2 ... Index = 0 Index = 1 Index = 2 IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 23 javax.swing.JComboBox Auswahllisten Der Liste der verfügbaren Elemente (=Items) ein Element hinzufügen : JComboBox meine_auswahl = new JComboBox(); meine_auswahl.addItem(“Auswahl 0“); meine_auswahl.addItem(“Auswahl 1“); meine_auswahl.addItem(“Auswahl 2“); Die Elemente (=Items) sind indiziert ! Das zuerst Hinzugefügte hat den Index 0 Das N-te den Index n-1 (im Beispiel den Index 2) meine_auswahl.getSelectedIndex():int Vom gewählten Element kann der Index in der Liste oder der Wert z.B. “Auswahl 0“ abgefragt werden ! meine_auswahl.getSelectedItem():Object IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 24 Die JComboBox mit Auswahl füllen public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); /** Creates new form BS_Dialog */ public BS_Dialog( java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); this.jComboBox1.addItem( "keine Ahnung"); this.jComboBox1.addItem( "Keine Deko"); this.jComboBox1.addItem( "Eckig"); this.jComboBox1.addItem( "Rund"); this.jComboBox2.addItem( "keine Ahnung"); this.jComboBox2.addItem( "direkt"); this.jComboBox2.addItem( "Schnitt"); this.jComboBox2.addItem( "abrunden"); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 25 Die Klasse java.awt.BasicStroke zum Gestalten einfacher Linienarten Konstruktoren ( hier interessante) BasicStroke stroke = new BasicStroke( width); BasicStroke stroke = new BasicStroke( width, cap, join); ... Form des Linienendes (cap) : 1. butt 2. round 3. square Form des Linienverbindung (join) : 1. bevel 2. miter 3. round Strichstärke (width) IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 26 Dialog zum Strichart ändern (Klasse BS_Dialog extends JDialog) Dialogoberfläche mit GridLayout rows:4 cols:2 JTextField JLabel JComboBox JButton bekommen Methoden über Events Action actionPerformed IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 27 Die Abbruch-Button Aktion public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: setVisible(false); dispose(); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 28 public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); Die OK-Button Aktion private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: if( jTextField1.getText() != null){ Ist die Strichstärke angegeben ? if((jComboBox1.getSelectedIndex() > 0) && (jComboBox2.getSelectedIndex() > 0)){ int cap = this.jComboBox1.getSelectedIndex() - 1, join = this.jComboBox2.getSelectedIndex() - 1; stroke = new BasicStroke( Float.parseFloat( jTextField1.getText()), cap, join); } ja, nur Strichstärke ! else{ stroke = new BasicStroke( Float.parseFloat( jTextField1.getText())); } } nein ? – dann einfachste Strichart else{ stroke = new BasicStroke(); } setVisible(false); dispose(); } Die OK-Button Aktion ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 29 public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); Die OK-Button Aktion private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: if( jTextField1.getText() != null){ Sind End- und Eckform if((jComboBox1.getSelectedIndex() > 0) && angegeben ? (jComboBox2.getSelectedIndex() > 0)){ int cap = this.jComboBox1.getSelectedIndex() - 1, join = this.jComboBox2.getSelectedIndex() - 1; stroke = new BasicStroke( Float.parseFloat( jTextField1.getText()), cap, join); } nur Strichstärke ! else{ stroke = new BasicStroke( Float.parseFloat( jTextField1.getText())); } } else{ stroke = new BasicStroke(); } setVisible(false); dispose(); } ... Die OK-Button Aktion } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 30 Die Änderungen in Smile 1. Ergänzung der JMenubar im ersten JMenu um ein neues JMenuItem 2. Verbinden des JMenuItem mit einer Methode über Events Action actionPerformed public class Leinwand extends JPanel { ... private void jMenuItem2ActionPerformed( java.awt.event.ActionEvent evt) { // Add your handling code here: BS_Dialog bsd = new BS_Dialog( this, true); bsd.show(); repaint(); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 31 Die Änderungen an Leinwand public class Leinwand extends JPanel { ... public void paintComponent(java.awt.Graphics g){ super.paintComponent( g); java.awt.Graphics2D g2d = (java.awt.Graphics2D) g; Enumeration laeufer = this.grafik_objekte.elements(); GrafikObjekt go; g2d.setStroke( BS_Dialog.stroke); while( laeufer.hasMoreElements()){ go = (GrafikObjekt) laeufer.nextElement(); go.zeichen_auf( g2d); } } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 32 ENDE noch Fragen ? IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 33 Die OK-Button Aktion public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: if( jTextField1.getText() != null){ Ist die Strichstärke angegeben ? ... /* (weiter auf der nächsten Folie ..) */ } else{ stroke = new BasicStroke(); } setVisible(false); dispose(); } ... } IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 34 Die OK-Button Aktion public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { } } ... /* (vorherige Folie ..) */ Sind End- und Verbindungstyp angegeben ? if((jComboBox1.getSelectedIndex() > 0) && (jComboBox2.getSelectedIndex() > 0)){ ... /* (weiter auf der nächsten Folie ..) */ } else{ stroke = new BasicStroke( Float.parseFloat( jTextField1.getText())); } ... /* (vorherige Folie ..) */ ... Bisher bekannt : - Strichstärke IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 35 Die OK-Button Aktion public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { } } ... /* vorherige Folien */ int cap = this.jComboBox1.getSelectedIndex() - 1, join = this.jComboBox2.getSelectedIndex() - 1; if( jTextField2.getText() != null){ Ist ein Gehrungswinkel angegeben ? ... /* (weiter auf der nächsten Folie ..) */ } else{ stroke = new BasicStroke( Float.parseFloat( jTextField1.getText()), cap, join); } Bisher bekannt : ... /* vorherige Folien */ - Strichstärke ... - Endtyp (cap) - Verbindungstyp (join) 36 IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 Die OK-Button Aktion public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { ... /* vorherige Folien */ if(( jTextField3.getText() != null) && ( jTextField4.getText() != null)){ ... /* (weiter auf der nächsten Folie ..) */ } } Ist die Linie gestrichelt ? } else{ stroke = new BasicStroke( Float.parseFloat( jTextField1.getText()), cap, join, Float.parseFloat( jTextField2.getText())); } ... /* vorherige Folien */ ... Bisher bekannt : - Strichstärke - Endtyp (cap) - Verbindungstyp (join) - Gehrungswinkel IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 37 Die OK-Button Aktion public class BS_Dialog extends javax.swing.JDialog { static public BasicStroke stroke = new BasicStroke(); private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { ... /* vorherige Folien */ java.util.StringTokenizer tokens = new java.util.StringTokenizer( jTextField3.getText(),";"); float[] dash_sequenz = new float[ tokens.countTokens()]; int i = 0; Abfolge Sichtbar - Unsichtbar while( tokens.hasMoreTokens()){ dash_sequenz[i] = Float.parseFloat( tokens.nextToken()); i++; } stroke = new BasicStroke( Float.parseFloat( jTextField1.getText()), cap, join, Float.parseFloat( jTextField2.getText()), dash_sequenz, Float.parseFloat( jTextField4.getText())); ... /* vorherige Folien */ } ... } alles bekannt IKG; Dörschlag, Plümer, Gröger; Einführung in die Programmierung mit Java WS03/04 38