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
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)
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.
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
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“
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
Beispiele für SDI-Fenster
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
• Menü für die Client-Fenster: Beispiel an der Assembler-IDE
FB Automatisierung und Informatik: Programmierung 2 10
• Menü für die Client-Fenster: Beispiel an der Assembler-IDE
Beispiele für MDI-Fenster (Powerpoint)
FB Automatisierung und Informatik: Programmierung 2 12
Swing Klassendiagramm
Swing Klassendiagramm
FB Automatisierung und Informatik: Programmierung 2 14
Verfügbare Komponenten I
JLabel und JTextField
JButton, JToggleButton JRadioButton, JCheckBox
JTextArea, JTextPane
JList, JComboBox
Verfügbare Komponenten II
JTable
JTabbedPane
FB Automatisierung und Informatik: Programmierung 2 16
Verfügbare Komponenten III
JExplorer:
• JTree
• JTable
Verfügbare Komponenten III:
Standardmeldungen
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
Aufbau eines Dialogfenster in Java
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();
Top-Level-Container eines JFrames
ContentPane ist die Pinnwand für die GUI-Elemente
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
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)
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)
GUI-Element: JTextField
• Ein JTextField nimmt Texteingabe entgegen.
• Nur eine Zeile Konstruktoren:
• JTextField()
• JTextField(String text)
Methoden:
• setText(String)
• String getText()
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)
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
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
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
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
Border-Layout
public BorderLayout1() { JLabel label1;
JLabel label2;
Container container;
JPanel panel;
North
South
West Center East
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
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
FB Automatisierung und Informatik: Programmierung 2 34
Grid-Layout
public GridLayout1() { JPanel panel;
// AnzZeilen, AnzSpalten
panel.setLayout( new GridLayout(4,5));
panel.add(...);
}
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
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
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.
FB Automatisierung und Informatik: Programmierung 2 38
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.
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
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
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
FB Automatisierung und Informatik: Programmierung 2 44
GridBagLayout
• Insets
• GridBagConstraints:
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.
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.
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.
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:
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:
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.
GridBag-Layout: 1. Beispiel
Beispiel:
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:
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:
FB Automatisierung und Informatik: Programmierung 2 54
GridBag-Layout: 2. Beispiel
ibib
GridBag-Layout: 3. Beispiel
Beispiel:
40% 60%
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
GridBag-Layout: 4. Beispiel
FB Automatisierung und Informatik: Programmierung 2 58
GridBag-Layout: 5. Beispiel
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
FB Automatisierung und Informatik: Programmierung 2 60
Ereignisse :
Klassen der verschiedenen Ereignisse:
Anzeige aus dem JBuilder 3,0
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.
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:
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");
}
}
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
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
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
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
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
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
FB Automatisierung und Informatik: Programmierung 2 70
Beispiel: Einfaches JFrame
• BorderLayout
• North: eine JTextField
• Center: eine JTextArea
• South: ein JButton
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
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
public static void main(String[] args) { JFrame01 frame = new JFrame01();
frame.setVisible(true);
}
} // JFrame01
Beispiel: Einfaches JFrame
FB Automatisierung und Informatik: Programmierung 2 74
Beispiel: Einfaches JFrame mit Action-Event
• BorderLayout
• North: eine JTextField
• Center: eine JTextArea
• South: ein JButton
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
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);
Beispiel: JCheckBox
• Mit einer JCheckBox kann man komfortabel Zustände auswählen.
• Jede CheckBox ist unabhängig von anderen.
• Die Plausibilitätskontrolle entfällt
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
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.
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
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));
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
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
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
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
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
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
FB Automatisierung und Informatik: Programmierung 2 88
Beispiel: JTable
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).
Beispiel: JTable
Mindestdaten einer Tabelle:
• Anzahl der Zeilen
• Anzahl der Spalten
• Beschreibung der Zellinhalte
• Beschreibung der Spalten
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) );
}
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);
FB Automatisierung und Informatik: Programmierung 2 94
Ergebnis: JTable
Tabelle01
Ergebnis: JTable mit 50 Zeilen
Nur die ersten 7 Zeilen sind erreichbar!
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
Ergebnis: JTable mit 50 Zeilen und Scrollpane
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);
}
}
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;
}
};
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
Beispiel: JTable Tabelle03
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));
Beispiel: JTable Tabelle04
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());
}
Beispiel: JTable Tabelle06, ArrayList mit einer Klasse
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
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
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");
}
}
Beispiel: JTable Tabelle07
• Sortieren der Tabelle
• Doppelklick erzeugt ein modales Dialogfenster
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
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; }
};
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:
■ // 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
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
Opendialog: FileChooser
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.
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
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
„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 FB Automatisierung und Informatik: Programmierung 2
void MnSaveAs_actionPerformed(ActionEvent e) {
MyInternalFrame frame = getActiveFrame();
if ( frame != null) {
frame.saveAs();
}
} // MnSave
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);
}
FB Automatisierung und Informatik: Programmierung 2 122