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