• Keine Ergebnisse gefunden

FB Automatisierung und Informatik

N/A
N/A
Protected

Academic year: 2021

Aktie " FB Automatisierung und Informatik"

Copied!
123
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Programmierung 2 Studiengang MI / WI

Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm

Hochschule Harz

FB Automatisierung und Informatik

mwilhelm@hs-harz.de

http://mwilhelm.hs-harz.de

Raum 2.202

Tel. 03943 / 659 338

(2)

FB Automatisierung und Informatik: Programmierung 2 2

Inhalt der Vorlesung

Überblick:

• Objekte und Methoden (1 Termin)

Swing (2 Termine)

• Exception (1 Termin)

• I/O-Klassen / Methoden (1 Termin)

• Algorithmen (Das Collections-Framework) (3 Termine)

• Design Pattern (4 Termine)

• JUnit (1/2 Termin)

• Graphentheorie (1 Termin)

(3)

Swing-Fenster

• Frame

– Einfaches Fenster (à Taschenrechner), AWT

• JFrame

– Einfaches Fenster (à Taschenrechner), Swing

• SDI-Frames

– Hauptfenster mit dem DesktopPane

• MDI-Frames

– Hauptfenster mit dem DesktopPane – Clientfenster als JInternalFrame

• Dialog

– Diese Klasse erlaubt die Erstellung modaler Fenster zur Eingabe

von Optionen, spezieller Dateneingabe et c.

(4)

FB Automatisierung und Informatik: Programmierung 2 4

Ein Dialogfenster ist ein Fenster, in dem der Benutzer Daten eingeben kann. Das Fenster mindestens einen Schalter (Ok). Mit Betätigen wird eine Aktion ausgelöst.

Beispiel: Meldung

Dialog - Benutzeroberflächen in Java

(5)

Single Dokument Interface

Ein SDI-Fenster zeigt Daten in einem Fenster und stellt sie dem Benutzer zur Verfügung.

Eigenschaften:

• Menüleiste

• Schalterleisten

• Statuszeile

• Kein Schalter „Ok“ oder „Abbruch“

(6)

FB Automatisierung und Informatik: Programmierung 2 6

Single Dokument Interface

Beispiele:

Calculator Einfaches Fenster

Notepad Darstellung eines Textes Explorer Zweigeteiltes Fenster

Spiele Komplexe Darstellung

Internetbrowser Zweigeteiltes Fenster

(7)

Beispiele für SDI-Fenster

(8)

FB Automatisierung und Informatik: Programmierung 2 8

Multi Dokument Interface (MDI)

Ein MDI-Fenster zeigt Daten in mehreren eigenständigen Fenster an.

Eigenschaften:

• Menüleiste

• Schalterleisten

• Statuszeile

• Kein Schalter „Ok“ oder „Abbruch“

• Wechselnde Menüleisten (Groupindex)

• Mehrere Fenster für eine Datei

• Komplex

(9)

• Menü für die Client-Fenster: Beispiel an der Assembler-IDE

(10)

FB Automatisierung und Informatik: Programmierung 2 10

• Menü für die Client-Fenster: Beispiel an der Assembler-IDE

(11)

Beispiele für MDI-Fenster (Powerpoint)

(12)

FB Automatisierung und Informatik: Programmierung 2 12

Swing Klassendiagramm

(13)

Swing Klassendiagramm

(14)

FB Automatisierung und Informatik: Programmierung 2 14

Verfügbare Komponenten I

JLabel und JTextField

JButton, JToggleButton JRadioButton, JCheckBox

JTextArea, JTextPane

JList, JComboBox

(15)

Verfügbare Komponenten II

JTable

JTabbedPane

(16)

FB Automatisierung und Informatik: Programmierung 2 16

Verfügbare Komponenten III

JExplorer:

• JTree

• JTable

(17)

Verfügbare Komponenten III:

Standardmeldungen

(18)

FB Automatisierung und Informatik: Programmierung 2 18

Aufbau eines Dialogfenster in Java

import javax.swing.*;

public class Frame1 extends JFrame { //Frame konstruieren

public Frame1() {

this.setSize(400, 300);

this.setTitle("Frame1");

}

public static void main(String[] args) { Frame1 frame = new Frame1();

frame.setVisible(true); // wichtig }

}

Originalframe. Ohne weitere GUI-Elemente

(19)

Aufbau eines Dialogfenster in Java

(20)

FB Automatisierung und Informatik: Programmierung 2 20

SDI-Fenster mittels JFrame

Konstruktoren:

JFrame()

JFrame(String sTitle);

Methoden:

setJMenuBar

setMaximizedBound setResizable

setTitle

setUndecorated(true); // ohne Menüleiste setSize(width, height)

setLocation(x,y)

Methoden:

JLayeredPane getLayeredPane() JRootPane getRootPane()

JGlassPane getGlassPane() setExtendedState(int state):

NORMAL

• ICONIFIED

• MAXIMIZED_HORIZ

• MAXIMIZED_VERT

• MAXIMIZED_BOTH

JRootPane root = f.getRootPane();

Container content = this.getContentPane();

(21)

Top-Level-Container eines JFrames

ContentPane ist die Pinnwand für die GUI-Elemente

(22)

FB Automatisierung und Informatik: Programmierung 2 22

Top-Level-Container

JFrame, JDialog und JWindow:

• Enthalten jeweils ein RootPane

JRootPane enthält:

• LayeredPane

− MenuBar

− ContentPane (speichert JComponent-Elemente)

• GlassPane

(23)

GUI-Element: JLabel

• Ein JLabel dient zur Beschriftung von GUI-Elementen.

• Es kann Text oder Symbole darstellen.

Konstruktoren:

JLabel() // Leerstring als Text JLabel(Icon image) // Icon als Beschriftung JLabel(Icon image, int horizontalAlignment)

JLabel(String text) // Label mit Text

JLabel(String text, Icon icon, int horizontalAlignment)

JLabel(String text, int horizontalAlignment)

(24)

FB Automatisierung und Informatik: Programmierung 2 24

GUI-Element: JButton

• Mit einem JButton kann man Aktionen ausführen.

• Ein Schalter kann Texte und / oder Symbole beinhalten.

• Ein Schalter benötigt eine Methode, in der die Aktionen ausgeführt werden.

Konstruktoren:

JButton()

JButton(Action a) JButton(Icon image) JButton (String text)

JButton (String text, Icon icon)

(25)

GUI-Element: JTextField

• Ein JTextField nimmt Texteingabe entgegen.

• Nur eine Zeile Konstruktoren:

• JTextField()

• JTextField(String text)

Methoden:

• setText(String)

• String getText()

(26)

FB Automatisierung und Informatik: Programmierung 2 26

GUI-Element: JTextArea

• Ein JTextArea nimmt Texteingabe entgegen.

• Aber mehrere Zeilen

• Scrollen mit JScrollPane Konstruktoren:

• JTextArea()

• JTextArea (String text)

Methoden:

• setText(String)

• String getText()

• append (String)

(27)

Bildschirmgestaltung: Layout

• Die Bildschirmstruktur wird durch ein Containerobjekt oder Layoutverwalter realisiert.

• Darstellung ist unabhängig von der Größe des Fensters

• Layout stellt eine Beziehung zwischen den Elementen dar.

Layout-Verwalter:

• BorderLayout

• GridLayout

• FlowLayout

• CardLayout

• BoxLayout

• GridBagLayout

(28)

FB Automatisierung und Informatik: Programmierung 2 28

Flow-Layout

• Das FlowLayout speichert die GUI-Elemente in einer Reihe.

• Die eingefügten Elemente

fließen je nach Breite des

Layouts

(29)

Flow-Layout

public class FlowLayout1 extends JFrame {

public FlowLayout1() {

JButton bn;

Integer I = new Integer(0);

this.getContentPane().add( new FlowLayout() );

for (int i=0; i<15; i++) {

bn = new JButton( Integer.toString(i+1) );

this.getContentPane().add(bn);

}

} // create

(30)

FB Automatisierung und Informatik: Programmierung 2 30

Flow-Layout mit extra JPanel

public class FlowLayout1 extends JFrame {

public FlowLayout1() { JPanel panel;

JButton bn;

Integer I = new Integer(0);

panel = new JPanel();

panel.setLayout ( new FlowLayout() );

for (int i=0; i<15; i++) {

bn = new JButton( Integer.toString(i+1) );

panel.add(bn);

}

this.getContentPane().add(panel, BorderLayout.NORTH);

} // create

FlowLayout1

(31)

Border-Layout

public BorderLayout1() { JLabel label1;

JLabel label2;

Container container;

JPanel panel;

North

South

West Center East

(32)

FB Automatisierung und Informatik: Programmierung 2 32

Border-Layout

public class BorderLayout1 extends JFrame {

public BorderLayout1() { JButton bn1;

this.getContentPane().setLayout ( new BorderLayout(3,1) );

bn1 = new JButton("1. Text"); // Label erzeugen

this.getContentPane().add(bn1, BorderLayout.SOUTH);

} // create

}

Ergebnis: Schalter hat die gesamte Breite

(33)

BorderLayout2

public class BorderLayout2 extends JFrame {

public BorderLayout2() { ...

panel = new JPanel();

panel.setLayout ( new FlowLayout() );

bn1 = new JButton("1. Text"); // Label erzeugen panel.add(bn1);

bn2 = new JButton("2. Text"); // Label erzeugen panel.add(bn2);

bn3 = new JButton("3. Text"); // Label erzeugen panel.add(bn3);

this.getContentPane().add(panel, BorderLayout.SOUTH);

} // create

(34)

FB Automatisierung und Informatik: Programmierung 2 34

Grid-Layout

public GridLayout1() { JPanel panel;

// AnzZeilen, AnzSpalten

panel.setLayout( new GridLayout(4,5));

panel.add(...);

}

(35)

Grid-Layout Ergebnis: Schalter hat die gesamte Breite

public class GridLayout1 extends JFrame {

public GridLayout1() { panel = new JPanel();

panel.setLayout ( new GridLayout(5,3) );

this.getContentPane().add(panel, BorderLayout.CENTER);

for (int i=0; i<15; i++) {

bn = new JButton( Integer.toString(i+1) );

panel.add(bn);

}

} // create

(36)

FB Automatisierung und Informatik: Programmierung 2 36

Grid-Layout Ergebnis: Aussehen der Schalter

public class GridLayout1 extends JFrame {

public GridLayout1() { panel = new JPanel();

panel.setLayout ( new GridLayout(5,3) );

this.getContentPane().add(panel, BorderLayout.CENTER);

for (int i=0; i<17; i++) { // 17 Schalter statt 15 bn = new JButton( Integer.toString(i+1) );

panel.add(bn);

}

} // create

(37)

Card-Layout

• Das CardLayout platziert Komponenten (gewöhnlich Bedienfelder) wie Karten in einem Stapel übereinander.

• Es wird jeweils nur eine Komponente bzw. ein Bedienfeld

• angezeigt.

• Sie haben die Möglichkeit, jeweils ein anderes Bedienfeld nach oben zu legen und somit durch die Bedienfelder zu blättern.

• Die Aktion steuert aber der Programmierer.

(38)

FB Automatisierung und Informatik: Programmierung 2 38

(39)
(40)

FB Automatisierung und Informatik: Programmierung 2 40

TabbedPane-Layout

Das TabbedPaneLayout platziert Komponenten

(gewöhnlich Bedienfelder) wie Karten in einem Stapel nebeneinander. Es wird

jeweils nur eine Komponente bzw. ein Bedienfeld

angezeigt. Man hat die

Möglichkeit, jeweils ein ande- res Bedienfeld nach vorne zu legen und somit durch die Register anzuzeigen. Der Anwender steuert das

Register.

(41)

TabbedPane-Layout

private void setGUI() {

JTabbedPane jTabbedPane1 = new JTabbedPane();

// 2. Definition der Farbpanels

myCanvas mc1 = new myCanvas(Color.green);

myCanvas mc2 = new myCanvas(Color.red);

myCanvas mc3 = new myCanvas(Color.blue);

jTabbedPane1.add("grün",mc1);

jTabbedPane1.add("rot",mc2);

jTabbedPane1.add("blau",mc3);

this.getContentPane().add(jTabbedPane1, BorderLayout.CENTER);

} // setGUI

(42)

FB Automatisierung und Informatik: Programmierung 2 42

JTabbedPane-Layout

// Erweiterer Karten

jTabbedPane1.addTab("Schalter", null, createPanel1() );

jTabbedPane1.addTab("Liste", null, createListe() );

JPanel createPanel1() { JButton bn1, bn2, bn3;

JPanel panel = new JPanel();

panel.setLayout ( new FlowLayout() );

bn1 = new JButton("1. Text"); // Label erzeugen panel.add(bn1,"South");

bn2 = new JButton("2. Text"); // Label erzeugen panel.add(bn2,"South");

bn3 = new JButton("3. Text"); // Label erzeugen panel.add(bn3,"South");

return panel;

} // createPanel1

(43)

Jpanel panel;

int n = jTabbedPane1.getTabCount();

for (int i=0; i<4; i++) { panel = new Jpanel();

jTabbedPane1.add(i.toString(), panel);

}

JTabbedPane: Einfügen

Jpanel panel;

int n = jTabbedPane1.getTabCount();

for (int j=0; j<n; j++) {

panel = (JPanel) jTabbedPane1.getComponentAt(j);

panel.setBackground(Color.RED);

}

JTabbedPane: Zugriff

(44)

FB Automatisierung und Informatik: Programmierung 2 44

GridBagLayout

• Insets

• GridBagConstraints:

(45)

GridBag-Layout

GridBagLayout ist ein extrem flexibles und leistungsstarkes Layout, das beim Erzeugen von Komponenten in einem Gitter mehr Möglichkeiten bietet als GridLayout. Mit Hilfe von GridBagLayout können Sie

Komponenten horizontal und vertikal in einem rechteckigen Gitter

positionieren. Die Komponenten können unterschiedliche Größen

besitzen und mehrere Zellen einnehmen.

(46)

FB Automatisierung und Informatik: Programmierung 2 46

GridBag-Layout

Eine Komponente kann auch kleiner als ihr Anzeigebereich sein, wenn keine Insets vorhanden sind, wie bei Komponente "6" im folgenden Beispiel.

Obwohl der Anzeigebereich aus nur einer Zelle besteht, gibt es keine Begrenzungen, die

die Komponente über ihre Minimalgröße hinaus vergrößern. In diesem Fall wird die Breite

des Anzeigebereichs durch die größeren Komponenten in den darüber befindlichen Zeilen

der gleichen Spalte bestimmt. Komponente "6" wird in ihrer kleinsten Größe angezeigt,

und da sie kleiner ist als ihr Anzeigebereich, wurde sie über eine anchor-Begrenzung am

linken Rand (West) des Anzeigebereichs platziert.

(47)

public class Insets extends Object implements Cloneable, Serializable

Konstruktor:

Insets(int top, int left, int bottom, int right)

public int top

The inset from the top. This value is added to the Top of the rectangle to yield a new location for the Top.

public int left

The inset from the left. This value is added to the left of the rectangle to yield a new location for the left edge.

public int bottom

The inset from the bottom. This value is added to the Bottom of the rectangle to yield a new location for the Bottom.

public int right

The inset from the right. This value is added to the Right of the rectangle to yield a new

location for the Right edge.

(48)

FB Automatisierung und Informatik: Programmierung 2 48

Class java.awt.GridBagConstraints

public class GridBagConstraints extends Object implements Cloneable, Serializable

The GridBagConstraints class specifies constraints for components that are laid out using the GridBagLayout class.

Konstruktoren:

GridBagConstraints()

Creates a GridBagConstraint object with all of its fields set to their default value.

GridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int anchor, int fill, Insets insets, int ipadx, int ipady) Creates a GridBagConstraints object with all of its fields set to the passed-in arguments.

Attribute:

int anchor

GridBagConstraints:

(49)

int gridx Element in der gridx-te Spalte int gridy Element in der gridy-te Zeile

int gridwidth Breite der Zelle (Anzahl der Spalten ) int gridheight Höhe der Zelle (Anzahl der Zeilen)

double weightx Wie viele Pixel erhält die Zelle (Prozentual in x-Richtung) double weighty Wie viele Pixel erhält die Zelle (Prozentual in y-Richtung)

int anchor Verknüpfung (NORTHEAST, EAST, SOUTHEAST, CENTER, SOUTH, SOUTHWEST, WEST, NORTH, NORTHWEST) int fill Ausfüllen (NONE, HORIZONTAL, BOTH, VERTICAL) Insets insets äußerer Rand (Top, Left, Bottom, Right)

int ipadx zusätzliche Breite des GUI-Elements int ipady zusätzliche Höhe des GUI-Elements

GridBagContraints Parameter:

(50)

FB Automatisierung und Informatik: Programmierung 2 50

public class Insets extends Object implements Cloneable, Serializable

Konstruktor:

Insets(int top, int left, int bottom, int right)

public int top

The inset from the top. This value is added to the Top of the rectangle to yield a new location for the Top.

public int left

The inset from the left. This value is added to the left of the rectangle to yield a new location for the left edge.

public int bottom

The inset from the bottom. This value is added to the Bottom of the rectangle to yield a new location for the Bottom.

public int right

The inset from the right. This value is added to the Right of the rectangle to yield a new

location for the Right edge.

(51)

GridBag-Layout: 1. Beispiel

Beispiel:

(52)

FB Automatisierung und Informatik: Programmierung 2 52

this.getContentPane().add(jLabel1,

new GridBagConstraints(0, 0, ?, ?, 0.0, 0.0,GridBagConstraints.??, GridBagConstraints. ??, new Insets(0,00,0,0), 0, 0));

this.getContentPane().add(TName,

new GridBagConstraints(1, 0, ?, ?, 0.0, 0.0,GridBagConstraints. ??, GridBagConstraints.??, new Insets(0,0,0,0), 00, 0));

this.getContentPane().add(BnOk,

new GridBagConstraints(0, 1, ?, ?, 0.0, 0.0,GridBagConstraints.??, GridBagConstraints.?? new Insets(0,0,0,0), 0, 0));

this.getContentPane().add(BnESC,

new GridBagConstraints(2, 1, ?, ?, 0.0, 0.0,GridBagConstraints.??, GridBagConstraints.?, new Insets(0,0,0,0), 0, 0));

GridBagContraints Parameter:

(53)

this.getContentPane().add(jLabel1,

new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4,20,4,0), 00, 0));

this.getContentPane().add(TName,

new GridBagConstraints(1, 0, 3, 1, 1.0, 0.0,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(4,0,4,20), 00, 0));

this.getContentPane().add(BnOk,

new GridBagConstraints(0, 1, 2, 1, 0.0, 0.0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(4,20,4,0), 0, 0));

this.getContentPane().add(BnESC,

new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(4,20,4,0), 0, 0));

GridBagContraints Parameter:

(54)

FB Automatisierung und Informatik: Programmierung 2 54

GridBag-Layout: 2. Beispiel

ibib

(55)

GridBag-Layout: 3. Beispiel

Beispiel:

40% 60%

(56)

FB Automatisierung und Informatik: Programmierung 2 56

Elemente:

Typ Name Inhalt

JLabel jLabel1 Name

JTextField TName Name des Studenten

JLabel jLabel2 Nummern

JTextField TMatrNr Matrikelnummer

JTextField TUNummer U-Nummer

JProgressBar jProgressBar1

JButton BnUp ProgressBar Addition

JButton BnDown ProgressBar Subtraktion

GridBag-Layout: 3. Beispiel

(57)

GridBag-Layout: 4. Beispiel

(58)

FB Automatisierung und Informatik: Programmierung 2 58

GridBag-Layout: 5. Beispiel

(59)

Ereignisse:

Ereignisse durch ein GUI-Element werden durch folgende Aktionen ausgelöst.

• Ein GUI-Element angeklickt

• Der Inhalt einer Textzeile wird verändert

• Die Bezeichnung eines JLabels wird verändert

• Mausklick auf einen Schalter

• Auswahl eines Menüs

• Auswahl eines Popupmenüs

• Maus über einem Element

• Maustaste wurde gedrückt

• Maustaste wurde losgelassen

• Taste wurde gedrückt

• Taste wurde losgelassen

• etc

(60)

FB Automatisierung und Informatik: Programmierung 2 60

Ereignisse :

Klassen der verschiedenen Ereignisse:

Anzeige aus dem JBuilder 3,0

(61)

Ereignisse :

Beispiel Schalter:

• Schalter hat für jede „Aktion“ eine Liste mit möglichen Empfängern.

• Um ein bestimmtes Ereignis zu erhalten, muss man sich registrieren lassen (ActionListener).

• Der Schalter ruft nun durch die Definition des Listener (Interface) die interne Funktion auf.

• Diese internen Funktionen werden nacheinander aufgerufen.

Also eine verkettete Liste.

(62)

FB Automatisierung und Informatik: Programmierung 2 62

Ereignisse :

private void BnOk_Click() { System.out.println("Hier

wurde ein Schalter gedrückt");

} Fenster:

Schalter „Ok“

Liste der registrierten Benutzer

BnOk_Click 1. Registrierung

ActionListener

2. Aufruf der Methode des ActionListeners

Instanz eines

ActionListeners:

(63)

1. Beispiel Schalter:

Dialog:

class Action1 extends JFrame { private vod setGUI() {

bn = new JButton( "Ok" );

myActionListener myAction = new myActionListener();

BnOk.addActionListener(myAction); // Registrierung }

}

class myActionListener implements java.awt.event.ActionListener { public void actionPerformed(ActionEvent e) {

System.out.println("Hier wurde ein Schalter gedrückt");

}

}

(64)

FB Automatisierung und Informatik: Programmierung 2 64

2. Beispiel Schalter:

class Action2 extends JFrame { int i=42;

private vod setGUI() {

bn = new JButton( "Ok" );

myActionListener myAction = new myActionListener();

BnOk.addActionListener(myAction); // Registrierung }

class myActionListener implements java.awt.event.ActionListener { public void actionPerformed(ActionEvent e) {

System.out.println("Hier wurde ein Schalter gedrückt: "+i);

BnOk_Click(); // Aufruf einer Methode in der Hauptklasse }

} // class

private void BnOk_Click() {

System.out.println("Hier wurde ein Schalter gedrückt");

}

} // Action2

Action1 bis 6

(65)

2. Beispiel Schalter:

class Action2 extends JFrame { int i=42;

private vod setGUI() {

bn = new JButton( "Ok" );

BnOk.addActionListener(new myActionListener() ); // Registrierung }

class myActionListener implements java.awt.event.ActionListener { public void actionPerformed(ActionEvent e) {

System.out.println("Hier wurde ein Schalter gedrückt: "+i);

BnOk_Click(); // Aufruf einer Methode in der Hauptklasse }

} // class

private void BnOk_Click() {

System.out.println("Hier wurde ein Schalter gedrückt");

}

} // Action2

(66)

FB Automatisierung und Informatik: Programmierung 2 66

3. Beispiel Schalter:

private void setGUI() {

bn = new JButton( "Ok" );

ActionListener al;

al = new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) { BnOk_Click(e);

} };

bn.addActionListener(al);

} // create

void BnOk_Click(ActionEvent e) {

setTitle("Der Schalter wurde gedrückt");

}

Der blauer Text definiert die interne Funktion des Actionlisteners.

Liste04 / Listener1

prog2

(67)

private void setGUI() {

BnOk = new JButton( "Ok" );

BnOk.addActionListener( new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) {

BnOk_Click(e);

} } );

} // setGUI

void BnOk_Click(ActionEvent e) {

setTitle("Der Schalter wurde gedrückt");

}

4. Beispiel Schalter: Anonyme Klasse

(68)

FB Automatisierung und Informatik: Programmierung 2 68

public class Action5 extends JFrame implements ActionListener { JButton BnOk = new JButton("Ok");

JButton BnEsc = new JButton("Abbruch");

private void setGUI() {

BnOk.addActionListener(this);

BnEsc.addActionListener(this);

} // setGUI

public void actionPerformed(ActionEvent e) { System.out.println("Hier actionPerformed");

if (e.getSource()==BnOk)

System.out.println("Hier BnOk");

if (e.getSource()==BnEsc)

System.out.println("Hier BnEsc");

}

} // Action5

5. Beispiel Schalter: ActionListener

(69)

public class Action5 extends JFrame implements ActionListener { JButton BnOk = new JButton("Ok");

JButton BnEsc = new JButton("Abbruch");

private void setGUI() {

BnOk.addActionListener(this);

BnOk.setActionCommand("Ok");

BnEsc.addActionListener(this);

} // setGUI

public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand();

if (cmd.equals("Ok") ) { BnOk_Click();

} }

6. Beispiel Schalter: ActionListener, ohne instanceof

(70)

FB Automatisierung und Informatik: Programmierung 2 70

Beispiel: Einfaches JFrame

• BorderLayout

• North: eine JTextField

• Center: eine JTextArea

• South: ein JButton

(71)

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class JFrame01 extends JFrame { JTextField editzeile = new JTextField();

JTextArea editor = new JTextArea();

//Frame konstruieren public JFrame01() {

setSize(1000, 700);

setTitle("1. JFrame");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // wenn close, dann exit setGUI();

} // create

Beispiel: Einfaches JFrame

(72)

FB Automatisierung und Informatik: Programmierung 2 72

void setGUI() {

JButton bnOk = new JButton("Ok"); // Schalter definieren // North

editzeile.setFont( new Font("Arial", Font.BOLD,28));

editzeile.setText("10"); // N =10

this.getContentPane().add(editzeile, BorderLayout.NORTH);

// Center

editor.setFont( new Font("Arial", Font.BOLD,28));

editor.setText("");

getContentPane().add( new JScrollPane(editor), BorderLayout.CENTER);

// South

bnOk.setFont( new Font("Arial", Font.BOLD,28));

this.getContentPane().add(bnOk, BorderLayout.SOUTH);

} // setGUI

Beispiel: Einfaches JFrame

(73)

public static void main(String[] args) { JFrame01 frame = new JFrame01();

frame.setVisible(true);

}

} // JFrame01

Beispiel: Einfaches JFrame

(74)

FB Automatisierung und Informatik: Programmierung 2 74

Beispiel: Einfaches JFrame mit Action-Event

• BorderLayout

• North: eine JTextField

• Center: eine JTextArea

• South: ein JButton

(75)

private void setGUI() {

myActionListener myAction = new myActionListener();

bnOk.addActionListener(myAction); // Registrierung } // setGUI

void BnOk_Click() {

editor.setText("Ok_Click"); // Editorinhalt löschen } // BnOk_Click

// interne Klasse

class myActionListener implements java.awt.event.ActionListener { public void actionPerformed(ActionEvent e) {

BnOk_Click();

} }

Beispiel: Einfaches JFrame mit Action-Event

(76)

FB Automatisierung und Informatik: Programmierung 2 76

void BnOk_Click() {

String sValue = editzeile.getText().trim();

int n;

try {

n = Integer.parseInt(sValue);

editor.setText("n: "+n+"\n" );

}

catch ( NumberFormatException e ){

editor.setText("Konvertierungsfehler: "+sValue );

}

} // BnOk_Click }

Beispiel: Einfaches JFrame mit Action-Event

double r = Double.parseDouble(sValue);

(77)

Beispiel: JCheckBox

• Mit einer JCheckBox kann man komfortabel Zustände auswählen.

• Jede CheckBox ist unabhängig von anderen.

• Die Plausibilitätskontrolle entfällt

(78)

FB Automatisierung und Informatik: Programmierung 2 78

Konstruktoren:

• JCheckBox()

• JCheckBox(Action a)

• JCheckBox(Icon icon)

• JCheckBox(String text)

• JCheckBox(String text, Icon icon)

• JCheckBox(String text, boolean selected)

• JCheckBox(String text, Icon icon , boolean selected)

Methoden:

• setText(String)

• String getText()

• isSelected

• setSelected

Beispiel: JCheckBox

(79)

Beispiel: JList

• JList ist eine Klasse, die in einer grafische Liste Objekte zur Auswahl anzeigt.

• Jedes Objekt benötigt die toString-Methode

• Man kann ein oder mehrere Elemente auswählen.

• Man kann Arrays, ArrayList oder Vektoren einfügen.

(80)

FB Automatisierung und Informatik: Programmierung 2 80

public Liste01() { String[] items;

items = new String[20];

for (int i=0; i<20; i++) {

items[i] = Integer.toHexString(i+1)+" Auswahl";

}

JList jlist = new JList(items);

this.getContentPane().add(jlist,

new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0 ,GridBagConstraints.CENTER,

GridBagConstraints.BOTH, new Insets(10,10,10,10), 0, 0));

} // create

Liste01

Liste mit GridbagLayout

(81)

Liste mit GridbagLayout und ScrollPane

String[] items;

items = new String[20];

for (int i=0; i<20; i++) {

items[i] = Integer.toHexString(i+1)+" Auswahl";

}

jlist = new JList(items);

scroll = new JScrollPane(jlist);

this.getContentPane().add(scroll, new GridBagConstraints(

0, 0, 1, 1, 1.0, 1.0

,GridBagConstraints.CENTER, GridBagConstraints.BOTH,

new Insets(10,10,10,10), 0, 0));

(82)

FB Automatisierung und Informatik: Programmierung 2 82

Beispiele von Listen: Liste03

• Liste03 mit Actionlistener

• Die ersten beiden Schalter liegen auf einem Event

• Rechts multi-select

Liste03

(83)

Beispiel: JList

Methoden der Klasse JList:

public JList (); // leere Liste

public JList (Object [] liststd); // Array mit Objekten

public JList (Vector liststd); // Vector mit Objekten

setSelectionMode( ListSelectionModel.SINGLE_SELECTION);

Nur ein Wert darf selektiert werden

setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION);

Ein Wert selektiert, oder ein Bereich

setSelectionMode( ListSelectionModel. MULTIPLE_INTERVAL_SELECTION);

Beliebiger Bereich darf selektiert werden

(84)

FB Automatisierung und Informatik: Programmierung 2 84

Methoden der Klasse JList:

boolean isSelectionEmpty()

Wurde mindestens ein Wert selektiert int getSelectedIndex()

Index des selektierten Eintrags int[] getSelectedIndices()

Index aller selektierten Einträge isSelectedIndex(int)

Object getSelectedValue()

Gibt das aktuelle Objekt zurück.

Falls kein Eintrag ausgewählt wurde, gibt es null zurück.

Object[] getSelectedValues()

Rückgabe aller selektierten Objekte oder null.

void setListData(Object[] listData) // Update der Einträge

void setListData(Vector listData) // Update der Einträge

(85)

import java.util.Vector;

JList jlist;

JScrollPane scroll;

Vector items=new Vector();

// Vector für die JList for (int i=0; i<20; i++) {

items.add( Integer.toHexString(i+1)+" Auswahl" );

}

jlist = new JList(items);

scroll = new JScrollPane(jlist);

this.getContentPane().add(scroll, ….

Beispiel: JList mit Vector

(86)

FB Automatisierung und Informatik: Programmierung 2 86

// import javax.swing.event.ListSelectionListener;

JList jlist;

JScrollPane scroll;

Vector items=new Vector();

// Vector für die JList for (int i=0; i<20; i++) {

items.add( Integer.toHexString(i+1)+" Auswahl" );

}

jlist = new JList(items);

scroll = new JScrollPane(jlist);

this.getContentPane().add(scroll, ….

list.addListSelectionListener(

new ListSelectionListener() {

public void valueChanged(ListSelectionEvent e) { FileListClick(e);

} } );

Beispiel: JList mit Abfrage der Selektion

(87)

JList-Versionen

• Liste01: JList ohne Scrollen

• Liste02: JList mit Scrollen

• Liste03: Zwei JListen, Abfrage mit Schaltern

• Liste04: JList mit Vector

• Liste05: Jist mit Klasse CPruefung

– Unterschiedliche Ausgabe (Prüfung, Note, Prüfung+Note, Note+Prüfung)

• Liste06: Beispiel Vector mit JList

– Einfügen, Löschen, Ändern

• Liste07: CellRenderer

• Liste08: CellRenderer und unterschiedliche Fonts

• Liste09: Zwei Klassen in einer Liste

(88)

FB Automatisierung und Informatik: Programmierung 2 88

Beispiel: JTable

(89)
(90)

FB Automatisierung und Informatik: Programmierung 2 90

Beispiel: JTable

• JTable is a GUI-Komponente die Daten in einer zwei- dimensionaler Form (X/Y) darstellen kann.

• In jeder Zelle kann ein beliebiges Objekt dargestellt werden.

• Jede Spalte kann individuelle Eigenschaften besitzen - Comboliste

- Eigener Editor - Farbsymbol - Checkbox

• Mit der „Default-Einstellung“ ist das Erzeugen einer Tabelle aber einfach.

• JTable verwendet zur Darstellung der Inhalte ein Datenmodell

(Klasse).

(91)

Beispiel: JTable

Mindestdaten einer Tabelle:

• Anzahl der Zeilen

• Anzahl der Spalten

• Beschreibung der Zellinhalte

• Beschreibung der Spalten

(92)

FB Automatisierung und Informatik: Programmierung 2 92

JTable Konstruktor und Methoden

new JTable( int rowsize, int colsize);

new JTable( TableModel stdModel);

new JTable( Vector Zellen, Vector header);

setTableHeader / getTableHeader setColumnModell

setModell(TableModel m) In createTable():

for (int i=0; i<_dbFile.getAnzFelder(); i++) {

TableColumn col = table.getColumnModel().getColumn( i );

col.setMinWidth(100);

col.setMaxWidth(500);

col.setResizable(true);

JTextField f = new JTextField();

f.setFont( new Font("Arial", Font.BOLD, 18) );

TableColumn aColumn = table.getColumn( headername(i) );

aColumn.setCellEditor( new DefaultCellEditor(f) );

}

(93)

Beispiel: JTable

TableModel stdModel = new AbstractTableModel() { public int getColumnCount() {

return 10;

}

public int getRowCount() { return 5;

}

public Object getValueAt(int row, int column) { return new Integer(row*column);

}

}; // stdModel

JTable table = new JTable(stdModel);

this.getContentPane().add(table, BorderLayout.CENTER);

(94)

FB Automatisierung und Informatik: Programmierung 2 94

Ergebnis: JTable

Tabelle01

(95)

Ergebnis: JTable mit 50 Zeilen

Nur die ersten 7 Zeilen sind erreichbar!

(96)

FB Automatisierung und Informatik: Programmierung 2 96

Beispiel: JTable

TableModel stdModel = new AbstractTableModel() { public int getColumnCount() {

return AnzCols;

}

public int getRowCount() { return AnzRows;

}

public Object getValueAt(int row, int column ) { return std[row][column];

}

// Header

public String getColumnName(int column) {

return new String( "C:"+Integer.toString(column+1) );

}

}; // std Model

JTable table = new JTable(stdModel);

scrollpane = new JScrollPane(table);

this.getContentPane().add(scrollpane, BorderLayout.CENTER);

Tabelle02

(97)

Ergebnis: JTable mit 50 Zeilen und Scrollpane

(98)

FB Automatisierung und Informatik: Programmierung 2 98

Datendarstellung in der Tabelle:

• Das TableModel benutzt ein globales Array std

• Konstante definieren

final int AnzRows = 40;

final int AnzCols = 15;

• Matrix definieren Object[][] std;

• Matrixdimension deklarieren

std = new String[ AnzRows][AnzCols];

• Matrix mit Werten füllen

for (int r=0; r<AnzRows; r++) { for (int c=0; c<AnzCols; c++) {

std[r][c] = Integer.toString(r*100+c);

}

}

(99)

Beispiel: JTable

TableModel stdModel = new AbstractTableModel() { public Object getValueAt(int row, int column ) {

return ???;

}

public boolean isCellEditable(int row, int column ) { return getColumnClass( column ) == String.class;

}

public void setValueAt(Object aValue, int row, int column) {

???? = aValue;

}

};

(100)

FB Automatisierung und Informatik: Programmierung 2 100

Beispiel: JTable Tabelle02

TableModel stdModel = new AbstractTableModel() {

public int getColumnCount() { return AnzCols; } public int getRowCount() { return AnzRows; } public Object getValueAt(int row, int column) {

return std[row][column];

}

public String getColumnName(int column) {

return new String( Integer.toString(column+1) );

}

public Class getColumnClass(int column) { return getValueAt(0, column).getClass();

}

public boolean isCellEditable(int row, int column) { return getColumnClass(column) == String.class;

}

public void setValueAt(Object aValue, int row, int column) { std[row][column] = aValue;

} };

Tabelle02

(101)

Beispiel: JTable Tabelle03

(102)

FB Automatisierung und Informatik: Programmierung 2 102

Beispiel: JTable Tabelle04: ComboBox + Tooltipp

Tabelle04

// Erezeuigen einer ComboBox als Spalteneditor JComboBox comboBox = new JComboBox();

comboBox.addItem("Red");

comboBox.addItem("Orange");

comboBox.addItem("Yellow");

comboBox.addItem("Green");

comboBox.addItem("Blue");

comboBox.addItem("Indigo");

comboBox.addItem("Violet");

TableColumn colorColumn = tableView.getColumn("Favorite Color");

// setzen der ComboBox als Spalteneditor

colorColumn.setCellEditor(new DefaultCellEditor(comboBox));

(103)

Beispiel: JTable Tabelle04

(104)

FB Automatisierung und Informatik: Programmierung 2 104

Beispiel: JTable Tabelle05

Tabelle05 public void setValue(Object value) {

int cellValue;

if (value instanceof Integer)

cellValue = ((Integer)value).intValue();

else

cellValue = 0;

if (cellValue > 30) {

setForeground(Color.black);

setBackground(Color.red);

} else {

setForeground(Color.red);

setBackground(Color.green);

}

setText((value == null) ? "" : value.toString());

}

(105)

Beispiel: JTable Tabelle06, ArrayList mit einer Klasse

(106)

FB Automatisierung und Informatik: Programmierung 2 106

Table06 :

ArrayList der Studenten:

Meier

Müller

Schulz

Pundt

Beck

setValue(row, column):

Mit row Student holen

Mit column Attribut holen

getValue(row, column, Object):

Mit row Student holen

Mit column Attribut setzen

(107)

Beispiel: JTable Tabelle06

public Object getValueAt(int row, int col) { Student std = (Student) liste.elementAt(row);

Item it;

switch (col) {

case 0: return new Item(std.getVorname(),std.getActivate()==1 );

case 1: return new Item(std.getNachname(),std.getActivate()==2 );

case 2: return new Item(Integer.toString(std.getMatrNummer()), std.getActivate()==4 );

case 3: return new Item(std.getUNummer(),std.getActivate()==8 );

case 4: return new Item(std.getFarbe(),std.getActivate()==16 );

default : return "XXXXXX";

} // case }

• Es werden nicht immer Strings in die Zelle eingefügt

• Stattdessen wird eine Wrapperklasse erzeugt

• Integer

(108)

FB Automatisierung und Informatik: Programmierung 2 108

Beispiel: JTable Tabelle06

Tabelle06 public void setValueAt(Object aValue, int row, int column) {

Student std = liste.get(row);

switch( column ) {

case 0: std.setVorname( (String) aValue );

case 1: std.setNachname( (String) aValue );

case 2: //std.setMatrNummer( aValue );

case 3: std.setUNummer( (String) aValue );

default: System.out.println("Fehler in Case-Anweisung");

}

}

(109)

Beispiel: JTable Tabelle07

• Sortieren der Tabelle

• Doppelklick erzeugt ein modales Dialogfenster

(110)

FB Automatisierung und Informatik: Programmierung 2 110

Tabellenbeispiele:

Tabelle01: Einfache Tabelle ohne Scrolling

Tabelle02: Einfache Tabelle mit Scrolling, std-Array Tabelle03: Tabelle mit einem Schalter zum Neuzeichnen Tabelle04: Tabelle mit Farbdarstellung und Tooltipp

ComboBox, Checkbox pro Spalte

Tabelle05: Tabelle mit ComboBox, Checkbox pro Spalte individueller Farbe bzgl. Favorite Number

Tabelle06: Tabelle mit Klasse und individueller Hintergrund

Tabelle07: Tabelle mit Sortierung und Dialogfenster (Doppelklick) Externe Sortierung

Tabelle08: Tabelle mit Sortierung und Dialogfenster (Doppelklick)

interne Sortierung

(111)

Wichtige Tabellen Methoden:

TableModel stdModel = new AbstractTableModel() {

public intgetColumnCount() { return AnzCols; } public intgetRowCount() { return AnzRows; } public ObjectgetValueAt(int row, int column) {

return std[row][column];

}

public String getColumnName(int column) { return new String( Integer.toString(column+1) );

}

public Class getColumnClass(int column) { return getValueAt(0, column).getClass();

}

public booleanisCellEditable(int row, int column) { return getColumnClass(column) == String.class;

}

public voidsetValueAt(Object aValue, int row, int column) { std[row][column] = aValue;

}

public intgetColumnWidth(int column) { return 200; }

};

(112)

FB Automatisierung und Informatik: Programmierung 2 112

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

JComboBox comboBox = new JComboBox( items );

TableColumn colorColumn = table.getColumn("Favorite Color");

// Eine Combobox dient als Editor für die Spalte "Favorite Color"

colorColumn.setCellEditor( new DefaultCellEditor(comboBox) );

// Setzen eines Hintergrunds und Tooltipp für die Farbspalte

DefaultTableCellRenderer colorColumnRenderer = new DefaultTableCellRenderer();

colorColumnRenderer.setBackground(Color.cyan);

colorColumnRenderer.setToolTipText("Click for combo box");

colorColumn.setCellRenderer(colorColumnRenderer);

table.setAutoCreateRowSorter(true);

numberColumnRenderer.setHorizontalAlignment(JLabel.RIGHT);

numbersColumn.setPreferredWidth(110);

Tabellencode:

(113)

■ // Erzeugen der SpaltenDefinition

■ DefaultTableCellRenderer numberColumnRenderer = new DefaultTableCellRenderer();

■ // Ausrichtung setzen

■ numberColumnRenderer.setHorizontalAlignment(JLabel.CENTER);

• // RIGHT LEFT

■ // holen der Spalten

■ TableColumn numbersColumn = table.getColumn("Favorite Number");

• MittelsSpaltenüberschrift

■ // setzen der Ausrichtung

numbersColumn.setCellRenderer(numberColumnRenderer);

Tabellenspalten ausrichten

(114)

FB Automatisierung und Informatik: Programmierung 2 114

public void MnLook_and_Feel(ActionEvent e) { try {

if (e.getSource() == MnLook_Feel_Windows ) { UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

SwingUtilities.updateComponentTreeUI(this.getContentPane() );

}

if (e.getSource() == MnLook_Feel_Metal ) {

UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

SwingUtilities.updateComponentTreeUI(this.getContentPane() );

}

if (e.getSource() == MnLook_Feel_Motif ) {

UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");

SwingUtilities.updateComponentTreeUI(this.getContentPane() );

}

if (e.getSource() == MnLook_Feel_Macintosh ) {

UIManager.setLookAndFeel("javax.swing.plaf.mac.MacLookAndFeel");

SwingUtilities.updateComponentTreeUI(this.getContentPane() );

}

} catch (Exception exc) { }

Look_and_Feel_02

Look & Feel

(115)

Opendialog: FileChooser

(116)

FB Automatisierung und Informatik: Programmierung 2 116

Methoden der Klasse „FileChooser“:

void setCurrentDirectory(File dir) Sets the current directory.

void setDialogTitle(String dialogTitle)

Sets the string that goes in the FileChooser window's title bar.

void setFileFilter(FileFilter filter) Sets the current File Filter.

void setMultiSelectionEnabled(boolean b)

Sets the filechooser to allow multiple file selections.

int showDialog(Component parent, String approveButtonText)

Pops a custom file chooser dialog with a custom ApproveButton.

int showOpenDialog(Component parent)

Pops up an "Open File" file chooser dialog.

int showSaveDialog(Component parent)

Pops up a "Save File" file chooser dialog.

(117)

Methoden der Klasse „FileChooser“:

File getCurrentDirectory()

Returns the current directory.

File getSelectedFile()

Returns the selected file.

File[] getSelectedFiles()

Returns a list of selected files if the filechooser is set to allow

(118)

FB Automatisierung und Informatik: Programmierung 2 118

„FileChooser“ Beispiel:

void mnOpen_click(ActionEvent e) {

JFileChooser jFileChooser1 = new JFileChooser();

String sFileName;

// Ok-Schalter gedrückt ?

if (jFileChooser1.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { sFileName = jFileChooser1.getSelectedFile().getPath();

MyJInternalFrame frame = new MyJInternalFrame( sFileName );

frame.setBounds(0, 0, 450, 300);

_desktopPane.add(frame);

_desktopPane.moveToFront(frame);

}

} // mnOpen

(119)

„FileChooser“ Beispiel:

void mnSaveAs_actionPerformed(ActionEvent e) { JFileChooser jFileChooser1 = new JFileChooser();

// Ok-Schalter gedrückt ?

if (jFileChooser1.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { String filename = jFileChooser1.getSelectedFile().getPath();

// MDI-Variante

MyInternalFrame frame = getActiveFrame();

frame.saveToFile(sFileName);

}

} // mnSave

(120)

120 FB Automatisierung und Informatik: Programmierung 2

void MnSaveAs_actionPerformed(ActionEvent e) {

MyInternalFrame frame = getActiveFrame();

if ( frame != null) {

frame.saveAs();

}

} // MnSave

(121)

Filter für die Klasse „FileChooser“

Die Klasse FileFilter erlaubt die Steuerung der Auswahl der Dateien mit Hilfe von Dateimasken.

Die Klasse ist abstract, so dass erst eine Klasse abgeleitet werden muss.

Beispiel MyFileFilter

Speicherung der Filter in einer Hashtabelle

Konstruktoren

public MyFileFilter(String extension, String description) { this(new String[] {extension}, description);

}

public MyFileFilter(String[] filters) { this(filters, null);

}

(122)

FB Automatisierung und Informatik: Programmierung 2 122

Filter für die Klasse „FileChooser“

Methoden zur Speicherung der Extension:

• public boolean accept(File f)

• public String getExtension(File f)

• public void addExtension(String extension)

• public String getDescription()

• public void setDescription(String description)

• public void setExtensionListInDescription(boolean b)

• public boolean isExtensionListInDescription()

(123)

„FileChooser“ Beispiel mit Filter:

void mnOpen_actionPerformed(ActionEvent e) { JFileChooser jFileChooser1 = new JFileChooser();

String sFileName;

MyFileFilter javaFilter, txtFilter;

javaFilter = new MyFileFilter("java", "Java-Texte");

txtFilter = new MyFileFilter( new String[] {"dat", "txt"}, "Texte");

jFileChooser1.setMultiSelectionEnabled(false);

jFileChooser1.setCurrentDirectory( new File("D:\\HS-Harz\\Vorlesungen\\GUI") );

jFileChooser1.addChoosableFileFilter(javaFilter);

jFileChooser1.addChoosableFileFilter(txtFilter);

if (JFileChooser.APPROVE_OPTION == jFileChooser1.showOpenDialog(this)) { // Aktion

}

} // mnOpen

Referenzen

ÄHNLICHE DOKUMENTE

Standard theory predicts higher contributions in the high cost treatments than in the low cost treatments; conditional cooperation predicts higher contributions in the

These issues especially lead to political controversy and the 'public' functions as a kind of antonym to 'private' when there are conflicts about public goods, basic services of

[r]

[r]

public void setVorname(String vorname) { this.vorname = vorname; } public int getAlter() { return alter; }. public void setAlter(int alter) { this.alter = alter;

Das Verfahren integrierte Planung im Dialog Die Vorgehensweise setzte auf ein integriertes, Ergebnis orientiertes Verfahren und knüpfte dabei an vorhandene Untersuchungen, Planungen

dukte des Weltmarktführers) und geben Sie dann Beispiele für Error, Fault und Failure

Geschäftstätigkeit Ziel/Kompetenzen: Chancen und Risiken des Außenhandels einschätzen können, Vertragsbestandteile int. Verträge erläutern können, Abwicklung von