Exception - M. Wilhelm

Werbung
Graphische Nutzerschnittstellen
• Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm
• Hochschule Harz
• FB Automatisierung und Informatik
• [email protected]
• Raum 2.202
• Tel. 03943 / 659 338
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
1
Inhalt
1. Einführung, Literatur, Begriffe
2. Architektur eines Fenstersystems
3. Java-Dialog (Dialog/SDI/MDI)
4. Grafik in Java
5. Benutzeroberfläche (Layout, Dialog, RDI, GUI-Elemente)
6. Design Pattern (Framework, Mehrschicht Anwendung)
7. Testroutinen (JUnit)
8. JDBC (Datenbankanbindung)
9. Threads
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
2
Benutzeroberflächen: Die Java Klassenbibliothek
• Regelmäßige Erweiterung und Veränderung mit den
Versionen des JDK
• Teile der Bibliothek werden in der Dokumentation zum JDK
als packages bezeichnet
• Objektorientierte Vorteile der Bibliothek
– Verfeinerung der allgemeine Klassen durch Vererbung der
Methoden innerhalb eines package an spezielle Klassen
– Bereitstellung generischer Datenstrukturen (Templates)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
3
Die Java Klassenbibliothek
• Beispiele
– java.lang: Sprachunterstützung (Threads, String)
– java.util: Hilfeklassen, allgemeine Datenstrukturen (Stack,
Vector)
– java.io: Ein/Ausgabe-Klassen (Dateien, Streams)
– java.nio: Ein/Ausgabe-Klassen (Neue Variante)
– java.nio2: Ein/Ausgabe-Klassen (JDK 7)
– java.net: Sockets, URL
– java.applets, java.awt: Java Windows Toolkit
• Erweiterungen (Auswahl)
– java.swing: AWT mit anpassbaren „Look & Feel“)
– speech: Sprachein- und Sprachausgabe
– JDBC: Datenbankanbindung
– Beans: wiederverwendbare Komponenten
– JMF: Java Media Foundation
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
4
Java: Exception
public class exception1 {
public static void main(String args[]) {
int j,k;
j=0;
k=3 / j;
} // main
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
5
Java: Exception
D:\HS-Harz\GUI>java exception1
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exception1.main(exception1.java:8)
D:\HS-Harz\GUI>
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
6
Java: Exception
Ein perfektes Programm mit perfekten Anwendern benötigt keine
Fehlerbehandlung. Alle Daten werden korrekt eingegeben, jede Datei
existiert und alle Module sind richtig programmiert.
Reale Welt:
Beim Absturz eines Programms entstehen:
•Datenverluste
•Unstimmigkeiten in einer Datenbank
•Neueingaben
•Ärger des Anwenders
Abhilfe:
•Benachrichtigung an den Anwender
•Sicherung der Daten
•Sicheres Beenden des Programms
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
7
Java: Exception
Definition:
public class Exception extends Throwable
The class Exception and its subclasses are a form of Throwable that indicates
conditions that a reasonable application might want to catch.
Since:
JDK1.0
Java benutzt für die Fehlerbehandlung ein „error trapping“ bzw. „exception handling“
(Delphi, C++). Diese Fehlerbehandlung ist weit flexibler als die VB Basicvariante
„On error goto“.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
8
Java: Exception
Ursachen für eine Exception:
•Fehlerhafte Eingabe (Numerische Eingabe, URL)
•Gerätfehler (Drucker, Webseite, Diskette)
•Physikalische Grenzen (mangelnder Speicher, Freier Speicherplatz)
•Programmierfehler (Arrayindex, Stackfehler, Overflow, Underflow)
Exception:
Bei einer Exception wird
• die aktuelle Prozedur sofort verlassen
• es wird ein Exceptionobjekt erzeugt
• es wird kein Returncode erzeugt
• der Aufrufcode wird nicht weiterabgearbeitet
• es beginnt die Suche nach einem „exception handler“, der für diese Exception
zuständig ist
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
9
Java: Exception-Arten
Standard Runtime Exceptions:
ArithmeticException:
An exceptional arithmetic situation has arisen, such as an integer
division (§15.16.2) operation with a zero divisor.
ArrayStoreException:
An attempt has been made to store into an array component a
value whose class is not assignment compatible with the
component type of the array (§10.10, §15.25.1).
ClassCastException:
An attempt has been made to cast (§5.4, §15.15) a reference to
an object to an inappropriate type.
IllegalArgumentException:
A method was passed an invalid or inappropriate argument or
invoked on an inappropriate object. Subclasses of this class
include:
IllegalThreadStateException: A thread was not in an appropriate state for a requested operation.
NumberFormatException:
An attempt was made to convert a String to a value of a numeric
type, but the String did not have an appropriate format.
IllegalMonitorStateException: A thread has attempted to wait on (§20.1.6, §20.1.7, §20.1.8)
or notify (§20.1.9, §20.1.10) other threads waiting on an object
that it has not locked.
IndexOutOfBoundsException: Either an index of some sort (such as to an array, a string, or a
vector) or a subrange, specified either by two index values or by
an index and a length, was out of range.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
10
Java: Exception
Package java:
java.io.IOException:
java.io.EOFException:
java.io.FileNotFoundException:
java.io.InterruptedIOException:
A requested I/O operation could not be completed normally.
Subclasses of this class include:
End of file has been encountered before normal completion of an
input operation.
A file with the name specified by a file name string or path was not
found within the file system.
The current thread was waiting for completion of an I/O operation,
and another thread has interrupted the current thread, using the
interrupt method of class Thread (§20.20.31).
java.io.UTFDataFormatException: A requested conversion of a string to or from Java modified UTF-8
format could not be completed (§22.1.15, §22.2.14) because the
string was too long or because the purported UTF-8 data was not the
result of encoding a Unicode string into UTF-8.
Standard Runtime Exceptions:
NullPointerException:
An attempt was made to use a null reference in a case where an
object reference was required.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
11
Java: Exception (Anfangsbeispiel)
import java.io.*;
public class exception1 {
public static void main(String argv[]) {
int j,k;
j=0;
k=3 / j;
} // main
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
12
Java: Exception (interne Abfrage)
import java.io.*;
public class exception2 {
public static void main(String argv[]) {
int j,k;
j=0;
try {
// Excecption Block
k=3 / j;
}
catch (ArithmeticException f) {
System.err.println(" ArithmeticException : " + f);
}
} // main
}
Kein Absturz für den Anwender
exception2
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
13
Java: Exception (externe Abfrage)
import java.io.*;
public class exception3 {
public static double loadDouble(String sFileName) {
// hier könnte ein Fehler auftreten
return 1.0; // Platzhalter
}
public static void main(String argv[]) {
double d;
d = loadDouble("c:\\1.dat");
} // main
}
exception3
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
14
Java: Exception (externe Abfrage)
import java.io.*;
public class exception4 {
public static double loadDouble(String sFileName) throws IOException {
return 1.0;
}
public static void main(String argv[]) {
double d;
d = loadDouble("c:\\1.dat"); // Zwang zur Benutzung einer Exception
} // main
}
Compilermeldung:
Nicht bekannte java.IO.IOException; muss abgefangen werden oder zum
Auslösen deklariert werden
Exception3-4
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
15
Java: Exception
import java.io.*;
public class exception4 {
public static double loadDouble(String sFileName) throws IOException {
return 1.23;
}
public static void main(String argv[]) {
double d;
try {
d = loadDouble("c:\\1.dat");
}
catch (IOException f) {
System.err.println("IOException: " + f);
}
} // main
} // class
Exception4
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
16
Java: Throw Exception
public static double loadDouble(String sFileName) throws IOException {
int i=1;
if (i==1) throw new EOFException("Modul loadDouble (Header hat falsche Version)");
return 1.234;
} // loadDouble
public static void main(String argv[]) {
double d;
try {
d = loadDouble("c:\\1.dat");
}
catch (EOFException f) {
System.err.println("main: " + f);
}
catch (IOException f) {
System.err.println("main: " + f);
}
} // main
Exception5
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
17
Java: Throw Exception
Ergebnis:
D:\HS-Harz\GUI>java exception5
main: java.io.EOFException: Modul loadDouble (Header)
D:\HS-Harz\GUI>
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
18
Java: Eigene Exceptionklasse
• Exception sind in eine Klassenhierarchie eingebettet.
• Sie dienen unterschiedlicher Aufgaben.
• Wünschenswert ist es manchmal, eine eigene Klasse für die
Abarbeitung zu definieren.
• Eigene Hierarchie
• Debug Informationen
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
19
Java: Eigene Exceptionklasse
Definition:
class HeaderFalseVersion extends IOException {
int version;
public HeaderFalseVersion() {
super();
}
public HeaderFalseVersion(String error) {
super(error);
}
public HeaderFalseVersion(String error, int version) {
super(error);
this.version = version;
}
} // HeaderFalseVersion
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
20
Java: finally Klausel
Beim Auslösen einer Exception wird sofort das jeweilige
Modul sofort verlassen.
Problem:
• Lokale Resourcen werden nicht sauber entfernt:
• Eine Datei ist geöffnet, wird nicht geschlossen
Abhilfe:
finally Klausel
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
21
Java: finally Klausel
Resource resource;
try {
resource = ...;
resource.methodThrowsException();
}
catch (Exception e) {
...
}
finally {
resource.close();
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
22
Java: finally Klausel
FileInputStream fin=null;
DataInputStream din=null;
byte b;
try {
fin = new FileInputStream( sFilename );
din = new DataInputStream(fin);
while ( din.available()>0 ) {
b = din.readByte();
System.out.println((char) (b) );
}
}
catch ( FileNotFoundException e ) {
System.err.println( "Die Datei ist nicht vorhanden!" );
}
catch ( IOException e ) {
System.err.println( "Schreib-/Leseprobleme!" );
}
finally {
if ( fin != null )
try { fin.close(); }
catch ( IOException e ) {
e.printStackTrace();
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
23
Java: finally Klausel
void createGrafik(String sFileName) {
Graphics g = image.getGraphics(sFileName);
try {
code mit der Möglichkeit einer Exception
}
catch(IOException e) {
done = false;
}
finally {
g.dispose(); // Speicher freigeben
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
3 Varianten
24
Java: finally Klausel
void createGrafik(String sFileName) {
Graphics g = image.getGraphics(sFileName);
try {
code mit der Möglichkeit einer Exception
}
catch(FileNotFoundException e) {
done = false;
}
catch(EOFException e) {
done = true;
}
finally {
g.dispose(); // Speicher freigeben
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
3 Varianten
25
Java: finally Klausel
void createGrafik(String sFileName) {
Graphics g = image.getGraphics(sFileName);
try {
code mit der Möglichkeit einer Exception
}
catch(IOException e) {
done = false;
}
catch(Exception e) {
done = true;
}
finally {
g.dispose(); // Speicher freigeben
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
3 Varianten
26
Java: Anwendung von Exceptions
Vier Regeln:
1)
Exception-Handling ersetzt nicht das Testen.
Das Auslösen einer Exception kostet sehr viel Zeit.
2)
Splitten von Exceptions
Wenn überhaupt nur eine try Klammer mit mehreren catch-Klauseln.
3)
Kein „Verstecken“ von Exceptions
Eine catch-Anweisung ohne eine Meldung ist nicht sinnvoll.
Tritt der Fehler auf, erhält der Anwender keine Mitteilung.
4)
Also weiterreichen von Exceptions
Das Verstecken einer Exception liefert „einfacheren Code“. Der
Aufrufer sollte aber von der Exception erfahren.
Man ist kein Hellseher beim Programmieren.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
27
Datenverarbeitung in Java
Es steht eine Vielzahl von Klassen/Modulen zur Verfügung (58):
Eingabeklassen:
ByteArray
InputStream
Buffered
InputStream
•
•
•
•
InputStream
File
InputStream
Checked
InputStream
Filter
InputStream
Digest
InputStream
Piped
InputStream
Inflater
InputStream
GZIP
InputStream
Sequence
InputStream
LineNumber
InputStream
StringBuffer
InputStream
Pushback
InputStream
ZIP
InputStream
gepuffert
Filter für Dateinamen
für Zeichen, Zeichenketten, Objekte, Token
mit Pipe-Verfahren
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
28
Ausgabe in eine Datei
OutputStream
ByteArray
OutputStream
File
OutputStream
Checked
OutputStream
Buffered
OutputStream
•
•
•
•
Filter
OutputStream
Digest
OutputStream
Piped
OutputStream
Deflater
OutputStream
GZIP
OutputStream
PrintStream
Data
OutputStream
ZIP
OutputStream
gepuffert
Filter für Dateinamen
für Zeichen, Zeichenketten, Objekte, Token
mit Pipe-Verfahren
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
29
Java: Ausgabe in eine Datei
Basis aller Ausgaben ist die Klasse OutputStream
Weitere Spezifikation durch z.B:
• FileOutputStream
Weitere Spezifikation durch:
•
•
•
•
•
•
•
BufferedOutputStream
PrintStream
DataOutStream
ZIPOutStream
CheckedOutStream
PipeOutStream
RandomAccessFile
mit seek
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
30
Java: Ausgabe in eine Datei
import java.io.*;
public class print1 {
public static void main(String argv[]) {
try {
FileOutputStream Fout = new FileOutputStream("1.dat");
// Druckausgabe in eine ASCII-Datei
PrintStream p = new PrintStream(Fout);
p.print("Hallo");
p.println("Hallo");
p.println("Hallo Studenten");
p.close();
}
catch (IOException ee) {
System.err.println("IOException: " + ee);
}
} // main
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
31
Java: Ausgabe in eine Datei (Double, int)
import java.io.*;
public class print2 {
// Ausgabe ohne Buffer, Ausgabe von Double Zahlen, binäres Format
public static void main(String argv[]) {
double d;
try {
FileOutputStream Fout = new FileOutputStream("1.bin");
DataOutputStream Dout = new DataOutputStream(Fout);
d = 1234.0;
Dout.writeDouble(d);
d = 1234.11111;
Dout.writeDouble(d);
Dout.writeInt(-1234);
Dout.close();
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
} // main
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
32
Java: Methoden der Klasse DataOutputStream
DataOutputStream:
writeBoolean
writeByte (Schreiben einer 8-Bit Vorzeichenzahl)
writeChar (Schreiben einer 16-Bit vorzeichenlosen Zahl)
writeDouble (Schreiben einer Double-Zahl)
writeFloat (Schreiben einer Single-Zahl)
writeInt (Schreiben einer 32-Bit Vorzeichenzahl)
writeLong (Schreiben einer 64-Bit Vorzeichenzahl)
writeShort (Schreiben einer 16-Bit Vorzeichenzahl)
writeUTF
writeChars
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
33
Int-Datentypen in Java
byte
from -128 to 127
short
from -32768 to 32767
int
from -2147483648 to 2147483647
long
from -9223372036854775808 to 9223372036854775807
char
from '\u0000' to '\uffff‘, =>, from 0 to 65535
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
34
Java: Lesen einer ASCII-Datei
import java.io.*;
import java.net.*;
public class read2 {
// Exception wird hier in die Definition eingebaut !!!!!
// WICHTIG: die Methode readLine ist veraltet, siehe
read3
public static void main(String argv[]) throws IOException {
FileInputStream fin;
DataInputStream din;
String s;
fin = new FileInputStream("c:\\1.dat");
din = new DataInputStream(fin);
while ( (s=din.readLine()) != null) {
System.out.println(s);
}
} // main
s=din.readLine()
while ( s != null) {
System.out.println(s);
s=din.readLine()
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
35
Java: Lesen einer ASCII-Datei (neu)
public static void main(String argv[]) throws IOException {
FileInputStream fin;
InputStreamReader iin;
LineNumberReader din;
// aktuelle Version zum Einlesen einer ASCII-Datei
String sLine;
try {
fin = new FileInputStream("read3.java");
iin = new InputStreamReader(fin);
din = new LineNumberReader(iin);
while ( din.ready() ) {
sLine = din.readLine();
System.out.println(sLine);
}
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
read3.java
36
Java: Lesen einer Binärdatei: read4
import java.io.*;
public static void main(String argv[]) throws IOException {
FileInputStream fin;
DataInputStream din;
char ch;
byte b;
try {
fin = new FileInputStream("1.dat");
din = new DataInputStream(fin);
while (true) {
// eventuell Absturz mit Exception
b =din.readByte();
ch = (char) (b);
System.out.println(ch);
}
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
pause();
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
37
Java: Lesen einer Binärdatei: read4
import java.io.*;
public class read4 {
private static void read(String sFilename){
FileInputStream fin;
DataInputStream din;
char ch;
byte b;
try {
fin = new FileInputStream( sFilename );
din = new DataInputStream(fin);
while ( din.available()>0 ) {
// ohne Fehler
b = din.readByte();
ch = (char) (b);
System.out.println(ch);
}
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
38
Java: Lesen einer Binärdatei
import java.io.*;
// Einlesen aus einer binären Datei, in der int-Werte gespeichert wurden
public class read4 {
private static void read(String sFilename){
int i;
try {
FileInputStream Fin = new FileInputStream(sFilename);
DataInputStream DataIn = new DataInputStream(Fin);
i = DataIn.readInt();
System.out.println(i);
i = DataIn.readInt();
// Einlesen von int Zahlen
System.out.println(i);
// Einlesen der Zahlen
i = DataIn.readInt();
public static void main(String argv[]) {
System.out.println(i);
read("1.int");
DataIn.close();
pause();
}
} // main
catch (IOException e) { }
} // class
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
39
Java: Schreiben und Lesen einer Binärdatei
import java.io.*;
// Ausgabe ohne Buffer, Ausgabe von int Zahlen, Einlesen der Zahlen
public class readwrite1 {
public static void main(String argv[]) {
int i;
try {
FileOutputStream Fout = new FileOutputStream("rw1.int");
DataOutputStream DataOut = new DataOutputStream(Fout);
i = 1234;
DataOut.writeInt(i);
i = 4321;
DataOut.writeInt(i);
DataOut.writeInt(-1234);
DataOut.close();
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
40
Java: Schreiben und Lesen einer Binärdatei
// weiter im Sourcecode
FileInputStream Fin = new FileInputStream("rw1.int");
// Einlesen der Dateien
DataInputStream DataIn = new DataInputStream(Fin);
i = DataIn.readInt();
System.out.println(i);
i = DataIn.readInt();
System.out.println(i);
i = DataIn.readInt();
System.out.println(i);
DataIn.close();
}
catch (IOException e) {
System.err.println("IOException: " + e);
}
System.out.println("Es wurde in die Datei rw1.int geschrieben und gelesen");
System.out.println("Bitte Taste druecken");
pause();
} // main
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
41
Java: Methoden der Klasse DataInputStream
DataInputStream:
readBoolean
readByte (…) Lesen einer 8-Bit Vorzeichenzahl
readChar (…) Lesen einer 16-Bit vorzeichenlosen Zahl
readDouble (…)
Lesen einer Double-Zahl
readFloat (…) Lesen einer Single-Zahl
readInt (…)
Lesen einer 32-Bit Vorzeichenzahl
readLong (…) Lesen einer 64-Bit Vorzeichenzahl
readShort (…) Lesen einer 16-Bit Vorzeichenzahl
readUTF(…)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
42
Read/Write mit RandomAccessFile
Methoden:
• int
• boolean
• byte
• char
• double
• float
• int
• String
• long
• short
• String
read(byte[] b, int off, int len)
readBoolean()
readByte()
readChar()
readDouble()
readFloat()
readInt()
readLine()
readLong()
readShort()
readUTF()
• int
• int
readUnsignedByte()
readUnsignedShort()
• void
• int
setLength(long newLength)
skipBytes(int n)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
43
Read/Write mit RandomAccessFile
Methoden:
• length
• void
• void
• int
Ausgabe der Länge der Datei
seek(long pos)
setLength(long newLength)
skipBytes(int n)
• void readFully(byte[] b)
Reads b.length bytes from this file into the byte array,
starting at the current file pointer.
• void readFully(byte[] b, int off, int len)
Reads exactly len bytes from this file into the byte array,
starting at the current file pointer.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
44
Read/Write mit RandomAccessFile
Beispiel:
private byte[] read(int count, int offset, String sFilename) {
RandomAccessFile fin = new RandomAccessFile( sFilename, "r");
if (offset>0) fin.seek(offset);
byte [] feld = new byte[count];
int anz = fin.read(feld, 0, count);
fin.close();
return feld;
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
45
Int-Datentypen in Java
byte
from -128 to 127
short
from -32768 to 32767
int
from -2147483648 to 2147483647
long
from -9223372036854775808 to 9223372036854775807
char
from '\u0000' to '\uffff‘, =>, from 0 to 65535
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
46
Dialog - Benutzeroberflächen in Java
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
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
47
Beispiele für Dialogfenster
Eigenschaften:
• Titel
• Aktives Element
• Schalter Abbruch
• Schalter Ok
Mit Betätigen des Schalters „Ok“ wird eine weitere Aktion ausgeführt.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
48
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: Graphische Nutzerschnittstellen
49
Single Dokument Interface
Beispiele:
Calculator
Einfaches Fenster
Notepad
Darstellung eines Textes
Explorer
Zweigeteiltes Fenster
Spiele
Komplexe Darstellung
Internetbrowser
Zweigeteiltes Fenster
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
50
Dialogfenster in Java
Ein Dialogfenster besteht aus einem Frame und weiteren
grafischen Benutzerelemente zur Eingabe und Ausgabe von
Daten.
Zum Beenden des Fensters müssen die Schalter „Ok“ und
„Abbruch“ vorhanden sein.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
51
GUI-Elemente in Java (aktive Elemente)
JLabel
JTextField
JSpinner
JButton
JToggleButton
JRadioButton
JCheckBox
ButtonGroup
JComboBox
JList
JTextArea
JTextPane
JEditorPane
JTable
JScrollBar
JTree
Anzeigefeld
einzeiliges Editorfeld
einzeiliges Editorfeld mit Drehfeld
Schalter (Text, Bild)
Schalter (Text, Bild)
Element zur Auswahl, korrespondiert mit anderen
Element zur Auswahl
Umfasst Checkbox, Radiobuttons
Aufklappbare Liste
Liste
Editor, ASCII
Editor, RTF, HTM
Editor, RTF, HTM
Tabelle
Scrollbalken
Anzeige der Elemente in einem Baum
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
52
GUI-Elemente in Java (Container)
JPanel
JTabbedPane
JScrollPane
JSplitPane
Box
Rahmen
Register
Speichert GUI-Element, Scroll-Mechanismus
Automatischer Aufteiler
Vertikal, Horizontal
GUI-Elemente in Java (Menüs, Schalter)
JMenuBar
JPopupMenu
JToolBar
JOptionPane
JColorChooser
JFileChooser
Speichert einzelne Menüs
Lokales Menü
Schalterleiste
Für einfache Dialogboxen (Klasse Dialog)
Farbe
Auswahl einer Datei
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
53
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);
}
}
Originalframe. Ohne weitere GUI-Elemente
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
54
Programm schließen, ab JDK 1,3
Methode setDefaultCloseOperation
DO_NOTHING_ON_CLOSE
− do not do anything - require the program to handle the operation in the
windowClosing method of a registered WindowListener object.
HIDE_ON_CLOSE
− automatically hide the frame after invoking any registered WindowListener
objects
DISPOSE_ON_CLOSE
− automatically hide and dispose the frame after invoking any registered
WindowListener objects
EXIT_ON_CLOSE
− The exit application default window close operation. If a window has this set
as the close operation and is closed in an applet, SecurityException may be
thrown. It is recommended you only use this in an application.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
55
Dialogfenster 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 = root.getContentPane();
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
56
Top-Level-Container
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
57
Top-Level-Container
JFrame, JDialog und JWindow:
• Enthalten jeweils ein RootPane
JRootPane enthält:
• LayeredPane
− MenuBar
− ContentPane (speichert JComponent)
• GlassPane
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
58
Dialogfenster in Java
public class FrameMsg1 extends JFrame {
public FrameMsg1() {
JLabel label1;
// Label Objekt
Container container;
setSize(400, 300);
// Größe
label1 = new JLabel("Text");
// Label erzeugen
label1.setText("Dies ist ein Anzeigetext"); // Labeltext
container = this.getContentPane();
// Container des Fensters
container.add(label1, BorderLayout.NORTH);
// Element einfügen
} // create
public static void main(String[] args) {
FrameMsg1 frame = new FrameMsg1();
frame.setVisible(true);
} // main
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
59
GUI-Element: JLabel
Ein JLabel dient zur Beschriftung von GUIElementen.
Es kann eine Zeile Text dargestellt werden.
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: Graphische Nutzerschnittstellen
60
GUI-Element: JLabel
Methoden:
void setHorizontalAlignment(int alignment)
Sets the alignment of the label's contents along the X axis.
void setHorizontalTextPosition(int textPosition)
Sets the horizontal position of the label's text, relative to its image.
void setIcon(Icon icon)
void setText(String text)
void setVerticalAlignment(int alignment)
Sets the alignment of the label's contents along the Y axis.
void setVerticalTextPosition(int textPosition)
Sets the vertical position of the label's text, relative to its image.
void updateUI()
Notification from the UIFactory that the L&F&F has changed.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
61
Dialogfenster in Java: Zwei JLabel
public class FrameMsg2 extends JFrame {
public FrameMsg2() {
JLabel label1, label2;
Container container;
container = this.getContentPane();
label1 = new JLabel("1. Text"); // Label erzeugen
container.add(label1, BorderLayout.NORTH);
label2 = new JLabel("2. Text"); // Label erzeugen
container.add(label2, BorderLayout.NORTH);
} // create
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
62
Verbesserte Version (zwei JLabel)
public FrameMsg3() {
JLabel label1;
JLabel label2;
Container container;
JPanel panel;
Ergebnis ?
container = this.getContentPane();
panel = new JPanel();
panel.setLayout ( new BorderLayout() );
label1 = new JLabel("1. Text"); // Label erzeugen
panel.add(label1, BorderLayout.NORTH );
label2 = new JLabel("2. Text"); // Label erzeugen
panel.add(label2, BorderLayout.SOUTH );
} // create
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
63
Verbesserte Version (zwei JLabel)
public FrameMsg3() {
JLabel label1;
JLabel label2;
Container container;
JPanel panel;
container = this.getContentPane();
panel = new JPanel();
panel.setLayout ( new GridLayout(3,1) );
label1 = new JLabel("1. Text"); // Label erzeugen
panel.add(label1);
label2 = new JLabel("2. Text"); // Label erzeugen
panel.add(label2);
} // create
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
64
Dialogfenster in Java: Zwei JLabel
public FrameMsg3() {
JLabel label1;
JLabel label2;
Container container;
JPanel panel;
container = this.getContentPane();
panel = new JPanel();
panel.setLayout ( new GridLayout(3,1) );
label1 = new JLabel("1. Text"); // Label erzeugen
panel.add(label1);
label2 = new JLabel("2. Text"); // Label erzeugen
panel.add(label2);
container.add(panel, BorderLayout.CENTER);
} // create
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
65
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: Graphische Nutzerschnittstellen
66
Flow-Layout
Das FlowLayout speichert die
GUI-Elemente in einer Reihe.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
67
Flow-Layout
public class Layout3 extends JFrame {
public Layout3() {
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: Graphische Nutzerschnittstellen
FlowLayout1
68
Flow-Layout
public class Layout3 extends JFrame {
public Layout3() {
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
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
FlowLayout1
69
Flow-Layout
public class Layout4 extends JFrame {
public Layout4() {
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.CENTER);
} // create
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
FlowLayout2
70
Border-Layout
North
West
public BorderLayout1() {
JLabel label1;
JLabel label2;
Container container;
JPanel panel;
Center
East
South
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
71
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
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
72
Border-Layout: Erweiterung Beispiel 06
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: Graphische Nutzerschnittstellen
73
Grid-Layout
public GridLayout1() {
JPanel panel;
// AnzZeilen, AnzSpalten
panel.setLayout( new GridLayout(4,5));
panel.add(.....);
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
74
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: Graphische Nutzerschnittstellen
75
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
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
76
Card-Layout
Das CardLayout platziert
Komponenten (gewöhnlich
Bedienfelder) wie K
arten in einem Stapel
übereinander. Es wird jeweils
nur eine Kom-ponente 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.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
77
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
78
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
79
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 anderes Bedienfeld nach vorne zu
legen und somit durch die
Register anzuzeigen.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
80
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: Graphische Nutzerschnittstellen
81
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
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
82
JTabbedPane: Einfügen
Jpanel panel;
int n = jTabbedPane1.getTabCount();
for (int i=0; i<4; i++) {
panel = new Jpanel();
jTabbedPane1.add(i.toString(), panel);
}
JTabbedPane: Zugriff
Jpanel panel;
int n = jTabbedPane1.getTabCount();
for (int j=0; j<n; j++) {
panel = (JPanel) jTabbedPane1.getComponentAt(j);
panel.setBackground(Color.RED);
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
83
GridBagLayout
• Insets
• GridBagConstraints:
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
84
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: Graphische Nutzerschnittstellen
85
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 plaziert.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
86
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: Graphische Nutzerschnittstellen
87
GridBagConstraints:
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
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
88
GridBagContraints Parameter:
int gridx
int gridy
Element in der gridx-te Spalte
gridy-te Zeile
int gridwidth
Breite der Zelle (Anzahl der Spalten )
int gridheight
Höhe der Zelle (Anzahl der Zeilen)
double weightx
double weighty
Verteilung von Platzänderung (Prozentual)
Verteilung zusätzlichen Platzes (Prozentual)
int anchor
Verknüpfung (NORTHEAST, EAST, SOUTHEAST, CENTER,
SOUTH, SOUTHWEST, WEST, NORTH, NORTHWEST)
int fill
Ausfüllen (NONE, HORIZONTAL, BOTH, VERTICAL)
Insets insets
externer Lückenbüßer (absolut), äußere Rand,
Top, Left, Bottom, Right
interner Lückenbüßer (absolut), Breite des GUI-Elements
interner Lückenbüßer (absolut), Höhe des GUI-Elements
int ipadx
int ipady
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
89
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: Graphische Nutzerschnittstellen
90
GridBag-Layout: 1. Beispiel
Beispiel:
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
GridBagLayout02
91
GridBagContraints Parameter:
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));
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
92
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));
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
93
GridBag-Layout: 2. Beispiel
ibib
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
94
GridBag-Layout: 3. Beispiel
Beispiel:
40%
60%
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
GridBagLayout10-11
95
GridBag-Layout: 3. Beispiel
Elemente:
Typ
Name
Inhalt
JLabel
JTextField
jLabel1
TName
Name
Name des Studenten
JLabel
JTextField
JTextField
jLabel2
TMatrNr
TUNummer
Nummern
Matrikelnummer
U-Nummer
JProgressBar
jProgressBar1
JButton
JButton
BnUp
BnDown
ProgressBar Addition
ProgressBar Subtraktion
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
96
GridBag-Layout: 4. Beispiel
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
GridBagLayout3
97
GridBag-Layout: 5. Beispiel
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
98
Dialogfenster: Klasse Border (RadioButton)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Border01
99
Beispiel: RadioButton
//Frame konstruieren
public FrameMsg09() {
setSize(300, 200);
setTitle("Radiobutton: FrameMsg09");
JPanel panel1;
JLabel label1;
JLabel label2;
ButtonGroup group1;
ButtonGroup group2;
setSize(400, 300);
setTitle("MessageBox: FrameMsg09");
rb1.setSelected(true oder false);
rb1.isSelected();
// Setzen
// Abfragen
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
RadioButton03
100
label1 = new JLabel("1. Auswahl");
label2 = new JLabel("2. Auswahl");
rb1 = new JRadioButton("1. Wahl", false);
rb2 = new JRadioButton("2. Wahl", true);
rb3 = new JRadioButton("3. Wahl", false);
rb4 = new JRadioButton("4. Wahl", false);
rb5 = new JRadioButton(“5. Wahl", false);
rb6 = new JRadioButton(“6. Wahl", false);
rb7 = new JRadioButton(“7. Wahl", true);
rb8 = new JRadioButton(“8. Wahl", false);
group1 = new ButtonGroup();
group1.add(rb1);
group1.add(rb2);
group1.add(rb3);
group1.add(rb4);
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
RadioButton03
101
panel1 = new JPanel();
panel1.setLayout ( new GridLayout(5,2) ); // 5 Zeilen , 2 Spalte
this.getContentPane().add(panel1, BorderLayout.CENTER);
panel1.add( label1 );
panel1.add( label2 );
panel1.add( rb1 );
panel1.add( rb5 );
panel1.add( rb2 );
panel1.add( rb6 );
panel1.add( rb3 );
panel1.add( rb7 );
panel1.add( rb4 );
panel1.add( rb8 );
} // create
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
RadioButton03
102
RadioButton-Versionen
• RadioButton01: Ohne GroupBox, Alle RadioButton einzeln
• RadioButton02: Mit GroupBox, Falsche Reihenfolge
• RadioButton03: Mit GroupBox, Richtige Reihenfolge
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
103
Beispiel: JList
JList ist eine Klasse, die in einer Liste Zeichenketten zur Auswahl
anzeigt. Man kann ein oder mehrere Elemente auswählen.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Liste01
104
Liste mit GridbagLayout
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
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Liste01
105
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: Graphische Nutzerschnittstellen
Liste02
106
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: Graphische Nutzerschnittstellen
Liste02
107
Beispiele von Listen: Liste03
• Liste03 mit Actionlistener
• Die ersten beiden Schalter liegen auf einem Event
• Rechts multi-select
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Liste03
108
Beispiel: JList
Methoden der Klasse JList:
public JList ();
public JList (Object [] listData);
public JList (Vector listData);
// leere Liste
// Array mit Objekten
// 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
void
void
setListData(Object[] listData)
setListData(Vector listData)
// Update der Einträge
// Update der Einträge
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
109
Methoden der Klasse JList:
boolean isSelectionEmpty()
Wurde mindestens ein Wert selektiert
int getSelectedIndex()
Index des selektierten Eintrags
int[] getSelectedIndices()
Index aller selektierten Einträge
boolean 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 setSelectedIndices(int[] indices)
void setSelectedIndex(int index)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
110
Beispiel: JList mit Vector
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, ….
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Liste04
111
Beispiel: JList mit Abfrage der Selektion
import javax.swing.event.ListSelectionListener;
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);
}
}
);
private void FileListClick(ListSelectionEvent e) {
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
}
112
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: Graphische Nutzerschnittstellen
113
Beispiel: JComboBox
JComboBox ist eine Klasse, die in einer Liste Zeichenketten zur
Auswahl anzeigt. Das Element klappt beim Anklicken auf. Man
kann ein Element auswählen.
combo.setEditable( cbBox1.isSelected() )
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
ComboBox1
114
JComboBox: 1. Beispiel
public ComboBox1() {
String [] items = new String[20];
for (int i=0; i<20; i++) {
items[i] = Integer.toHexString(i+1)+" Auswahl";
}
jComboBox combo = new JComboBox(items);
this.getContentPane().add(combo, BorderLayout.CENTER);
combo.setEditable(false);
combo.setSelectedIndex(-1); // keine Markierung
} // create
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
ComboBox1
115
Beispiel: JComboBox
Methoden der Klasse JComboBox:
public JComboBox ();
// leere Liste
public JComboBox (Object [] listData); // Array mit Objekten
public JComboBox (Vector listData); // 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: Graphische Nutzerschnittstellen
116
Beispiel: JComboBox
Methoden der Klasse JComboBox:
boolean isSelectionEmpty()
Wurde mindestens ein Wert selektiert
int getSelectedIndex()
// Index (0 bis n-1
ODER -1)
Object getSelectedItem()
Ergibt das selektierte Object oder null, wenn kein Eintrag markiert wurde
Object[] getSelectedObjects()
Return an array of the values for the selected cells.
combo.setEditable(false / true);
combo.setSelectedIndex(-1 / 0 bis n-1 );
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
117
Beispiel: JComboBox
JComboBox comboBox = new JComboBox();
// Eintragen mittels addItem
comboBox.addItem("Red");
comboBox.addItem("Orange");
comboBox.addItem("Yellow");
comboBox.addItem("Green");
comboBox.addItem("Blue");
comboBox.addItem("Indigo");
comboBox.addItem("Violet");
comboBox.setEditable(true);
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
118
Plausibilität
import java.util.regex.Matcher;
import java.util.regex.Pattern;
String sStr="";
boolean bOk;
while(!bOk){
sStr=JOptionPane.showInputDialog("Bitte Dateinamen eingeben");
// Zum Abfangen falscher Eingaben wird via Regex überprüft
// Pattern p = Pattern.compile("[a-zA-Z_0-9]++");
Matcher m = p.matcher(in);
bOk = m.matches();
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
119
119
Plausibilität
import javax.swing.InputVerifier;
…
String sDateText =dateField.getText();
boolean flag = true;
// Pruefung ob Format korrekt
if (sDateText.matches("\\d\\d\\.\\d\\d\\.\\d\\d\\d\\d")) {
// Datum verarbeiten
} else {
JOptionPane.showMessageDialog(
null, "Bitte geben Sie das Datum im Format tt.mm.jjjj ein",
"Hinweis", JOptionPane.ERROR_MESSAGE);
dateField.grabFocus();
dateField.selectAll();
}
//Beispiel von http://www.java-forum.org/java-basics-anfaenger-themen/32901-inputveryfier-auf-jtextfield.html
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
120
Beispiel: JTable
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
121
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
122
Beispiel: JTable
• JTable is a GUI-Komponente die Daten in einer zweidimensionaler 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).
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
123
Beispiel: JTable
Mindestdaten einer Tabelle:
• Anzahl der Zeilen
• Anzahl der Spalten
• Beschreibung der Zellinhalte
• Beschreibung der Spalten
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
124
JTable Konstruktor und Methoden
new JTable( int rowsize, int colsize);
new JTable( TableModel dataModel);
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) );
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
125
Beispiel: JTable
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return 10;
}
public int getRowCount() {
return 5;
}
public Object getValueAt(int row, int column) {
return new Integer(row*column);
}
}; // DataModel
JTable table = new JTable(dataModel);
this.getContentPane().add(table, BorderLayout.CENTER);
Tabelle01
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
126
Ergebnis: JTable
Tabelle01
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
127
Ergebnis: JTable mit 50 Zeilen
Nur die ersten 7 Zeilen sind erreichbar!
Tabelle01
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
128
Beispiel: JTable
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return AnzCols;
}
public int getRowCount() {
return AnzRows;
}
public Object getValueAt(int row, int column) {
return data[row][column];
}
// Header
public String getColumnName(int column) {
return new String( "C:"+Integer.toString(column+1) );
}
}; // data Model
JTable table = new JTable(dataModel);
scrollpane = new JScrollPane(table);
this.getContentPane().add(scrollpane, BorderLayout.CENTER);
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Tabelle02
129
Ergebnis: JTable mit 50 Zeilen und Scrollpane
Tabelle02
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
130
Datendarstellung in der Tabelle:
• Das TableModel benutzt ein globales Array data
• Konstante definieren
final int AnzRows = 40;
final int AnzCols = 15;
• Matrix definieren
Object[][] data;
• Matrixdimension deklarieren
data = new String[ AnzRows][AnzCols];
• Matrix mit Werten füllen
for (int r=0; r<AnzRows; r++) {
for (int c=0; c<AnzCols; c++) {
data[r][c] = Integer.toString(r*100+c);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
131
Beispiel: JTable
TableModel dataModel = 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;
}
};
Tabelle02
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
132
Beispiel: JTable Tabelle02
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return AnzCols;
}
public int getRowCount() {
return AnzRows;
}
public Object getValueAt(int row, int column) {
return data[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) {
data[row][column] = aValue;
}
};
Tabelle02
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
133
Beispiel: JTable Tabelle03
Tabelle03
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
134
Beispiel: JTable Tabelle04: ComboBox + Tooltipp
// Create a combo box to show that you can use one in a table.
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");
// Use the combo box as the editor in the "Favorite Color" column.
colorColumn.setCellEditor(new DefaultCellEditor(comboBox));
Tabelle04
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
135
Beispiel: JTable Tabelle04
Tabelle04
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
136
Beispiel: JTable 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());
}
Tabelle05
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
137
Beispiel: JTable Tabelle06
Tabelle06
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
138
Beispiel: JTable Tabelle06
public Object getValueAt(int row, int col) {
myData data = (myData) liste.elementAt(row);
Item it;
switch (col) {
case 0: return new Item(data.getVorname(),data.getActivate()==1 );
case 1: return new Item(data.getNachname(),data.getActivate()==2 );
case 2: return new Item(Integer.toString(data.getMatrNummer()),
data.getActivate()==4 );
case 3: return new Item(data.getUNummer(),data.getActivate()==8 );
case 4: return new Item(data.getFarbe(),data.getActivate()==16 );
default : return "XXXXXX";
} // case
}
• Es werden keine String in die Zelle eingefügt
• Stattdessen wird eine Wrapperklasse erzeugt
Tabelle06
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
139
Beispiel: JTable Tabelle06
public void setValue(Object value) {
Item it;
boolean bActivate;
if (value instanceof Item) {
bActivate = ((Item) value).activate;
if (bActivate) {
//setForeground(Color.black);
setBackground(Color.red);
}
else {
setBackground(Color.white);
}
setText((value == null) ? "" : value.toString());
}
};
Tabelle06
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
140
Beispiel: JTable Tabelle07
• Sortieren der Tabelle
• Doppelklick erzeugt ein modales Dialogfenster
Tabelle07
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
141
class CData implements Comparable{
int static sorttyp=1;
public int compareTo(Object obj) {
CData myD;
myD = (CData) obj;
switch (sorttyp) {
case 1: return _Vorname.compareToIgnoreCase(myD._Vorname );
case 2: return _Name.compareToIgnoreCase(myD._Name );
case 3: if (_MatrNummer < myD._MatrNummer )
return -1;
else {
if (_MatrNummer > myD._MatrNummer )
return 1;
else
return 0;
}
case 4: return _UNummer.compareToIgnoreCase(myD._UNummer );
default: return 0;
} // case
} // compareTo, Rückgabe -1 0 +1
} // CData
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
142
Tabellenbeispiele:
Tabelle01:
Einfache Tabelle ohne Scrolling
Tabelle02:
Einfache Tabelle mit Scrolling, data-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
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
143
Wichtige Tabellen Methoden:
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return AnzCols;
}
public int getRowCount() {
return AnzRows;
}
public Object getValueAt(int row, int column) {
return data[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) {
data[row][column] = aValue;
}
public int getColumnWidth(int column) { return 200; }
};
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
144
Tabellencode:
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);
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
145
Tabellenspalten ausrichten
■ // 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);
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
146
Javaklasse: Timer
Die Klasse Timer erlaubt das automatische Aufrufen
Deklaration in der Klasse:
public class Timer1 extends JFrame implements ActionListener {
Timer animator; // Timer
animator = new Timer(500, this); // 500 ms
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
147
Methoden der Klasse Timer
Timer muss angestellt werden:
animator.start();
Abstellen des Timers:
animator.stop();
Aufruf des Timers:
public void actionPerformed(ActionEvent e) {
} // actionperformed
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
148
Komplettes Beispiel für einen Timer
public class Timer1 extends JFrame implements ActionListener {
Timer animator; // Timer
long summe = 0;
public Timer1 () {
animator = new Timer(500, this); // 500 ms
animator.start(); // starten
} // startLoading
public void actionPerformed(ActionEvent e) {
summe += 1;
System.out.println(summe);
if (summe>10) {
animator.stop(); //
System.exit(0); // Beenden
}
} // actionperformed
}
Timer1
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
149
2. Komplettes Beispiel für einen Timer
public class Timer2 extends JFrame implements ActionListener {
Timer animator; // Timer
long summe = 0;
JLabel label;
public Timer2 () {
this.setSize(400, 300); // Breite Höhe
this.setTitle("Timertest"); // Titel
System.out.println(summe);
label = new JLabel("Label");
animator = null; // Null setzen
label.setText("jLabel1");
this.getContentPane().add(label, BorderLayout.NORTH
startLoading(); // init und start des Timers
}
Timer2
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
150
2. Komplettes Beispiel für einen Timer
// init und Start des Timers animator
public void startLoading() {
// Sicherheitsbafrage
if(animator == null) {
animator = new Timer(500, this); // 500 ms
animator.start(); // starten
}
} // startLoading
// Beendet den Timer und das gesamnte Progamm !
public void stopLoading() {
// Sicherheitsabfrage
if(animator != null) {
animator.stop(); //
animator = null; // Anfangszustand
System.exit(0); // Beenden
}
} // stopLoading
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
151
2. Komplettes Beispiel für einen Timer
public void actionPerformed(ActionEvent e) {
summe += 1;
label.setText( Long.toString(summe) );
System.out.println(summe);
if (summe>10) {
stopLoading();
}
} // actionperformed
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Timer1
152
Beispiel: JTree
Rest des Scriptes als Extra-Datei
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Tree1
153
Look & Feel
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) {
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Look_and_Feel_02
154
SDI und MDI-Fenster
• Frame
– Einfaches Fenster (à Taschenrechner), AWT
• JFrame
– Einfaches Fenster (à Taschenrechner), Swing
• SDI- und MDI-Frames
– Hauptfenster mit dem DesktopPane
– Clientfenster als JInternalFrame
• JDialog
– Diese Klasse erlaubt die Erstellung modaler Fenster zur
Eingabe von Optionen, spezieller Dateneingabe etc.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
155
Beispiel-Dialog
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
156
Aufruf eines Dialogs der Klasse CDialog
void editTabellenEintrag() {
int k= tabelle.getSelectedRow();
CData data = (CData) liste.elementAt(k);
// Aufruf JDialog
MyJDialog dlg = new MyJDialog(this, data);
if ( dlg.bResult ) {
System.out.println("Ok gedrückt, Daten übernehmen");
Vorname.setText( dlg.getVorname() );
}
}
bResult ist eine öffentliche
Statusvariable, der Klasse
CDialog
public MyJDialog() {
setModal(true);
setVisible(true);
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
157
Klasse CDialog
class MyJDialog extends JDialog {
JLabel label1= new JLabel("Vorname");
JTextField vorname= new JTextField();
public boolean bResult; // gibt an, ob Ok oder Esc gedrückt wurde
public MyJDialog( Frame parent, CData data) {
super(parent); // oder super(parent, true);
setModal(true);
setTitle("Bearbeiten eines Datensatzes");
setSize(400,350);
bResult=false;
setGUI(data);
setVisible(true);
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
158
Tastencodes: getKeyStroke
public static KeyStroke getKeyStroke(int keyCode, int modifiers)
Return a shared instance of a key stroke given a char code and a set of
modifiers -- the key is activated when it is pressed.
The "virtual key" constants can be used to specify the key code.
For example:
java.awt.event.KeyEvent.VK_ENTER
java.awt.event.KeyEvent.VK_TAB
java.awt.event.KeyEvent.VK_SPACE
The modifiers consist of any combination of:
• java.awt.Event.SHIFT_MASK (1)
• java.awt.Event.CTRL_MASK (2)
• java.awt.Event.META_MASK (4)
• java.awt.Event.ALT_MASK (8)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
159
java.awt.event.KeyEvent
VK_NUMPAD0 →VK_NUMPAD9
VK_0 → VK_9
VK_A → VK_Z
VK_F1 → VK_F24
// Ziffernblock
// Normale Ziffern
// Normale Buchstaben
// Funktionstasten
VK_AT
VK_ALT
VK_SHIFT
VK_CONTROL
VK_ENTER
VK_HOME
// Zeichen @
// Alternate-Taste
// Umschalt-Taste
// Control bzw. Steuerung-Taste
// Eingabetaste
// Taste pos1
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
160
java.awt.event.KeyEvent
VK_KP_LEFT
VK_KP_RIGHT
VK_KP_UP
VK_KP_DOWN
VK_PAGEDOWN
VK_PAGEUP
VK_UP
VK_KP_DOWN
VK_PAGEDOWN
VK_PAGEUP
VK_INSERT
VK_END
VK_ESCAPE
// Taste Pfeil links
// Taste Pfeil rechts
// Taste Pfeil oben
// Taste Pfeil unten
// Taste Seite unten
// Taste Seite oben
// Taste Pfeil oben
// Taste Pfeil unten
// Taste Seite unten
// Taste Seite oben
// Taste Einfg
// Taste Ende
// Taste Abbruch
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
161
java.awt.event.KeyEvent Beispiel key01.java
BnOk.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
System.out.println("keyReleased");
}
public void keyPressed(KeyEvent evt) {
System.out.println("KeyPressed");
if(evt.getKeyCode()==KeyEvent.VK_ENTER) {
System.out.println("
Enter");
}
}
});
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
162
java.awt.event.KeyEvent Beispiel key02.java
public void keyReleased(KeyEvent e) {
System.out.println("keyReleased");
if ( e.getID() == KeyEvent.KEY_TYPED) {
char c = e.getKeyChar();
System.out.println("key character = '" + c + "'");
} else {
int keyCode = e.getKeyCode();
String keyString = "key code = " + keyCode
+ " ("
+ KeyEvent.getKeyText(keyCode)
+ ")";
System.out.println(keyString);
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
163
Kurzbeispiele:
• Reihenfolge der Konstruktoren:
• Abstrakte Klassen / Methoden
• Simulation von Autoverkehr
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
164
class Speisen {
public Speisen() {
println(„Speisen");
}
}
class Brot {
}
class Kaese {
}
class Salat {
}
class Mittagessen extends Speisen {
}
class MensaEssen extends Mittagessen {
}
class Sandwich extends MensaEssen {
Brot b = new Brot ();
Kaese k = new Kaese();
Salat s = new Salat();
Sandwich() {
super();
println("Sandwich");
}
static public void main(String[] args) {
new Sandwich();
}
}
interface
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
165
class Speisen {
public Speisen() {
println(„Speisen");
}
}
class Brot {
}
class Kaese {
}
class Salat {
}
class Mittagessen extends Speisen {
}
class MensaEssen extends Mittagessen {
}
Speisen
Mittagessen
Mensaessen
Brot
Käse
Salat
Sandwich
class Sandwich extends MensaEssen {
Brot b = new Brot ();
Kaese k = new Kaese();
Salat s = new Salat();
Sandwich() {
super();
println("Sandwich");
}
static public void main(String[] args) {
new Sandwich();
}
}
1)
2)
3)
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
Vererbung
Lokale Variablen
Konstruktor
166
abstract class Glyph {
abstract void draw();
Glyph() {
System.out.println("Glyph() vor draw() ");
draw();
System.out.println("Glyph() nach draw() ");
}
}
class RoundGlyph extends Glyph {
int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println(" RoundGlyph radius: "+ radius);
}
void draw() {
System.out.println(" RoundGlyph.draw radius: "+ radius);
}
static public void main(String[] args) {
RoundGlyph rg = new RoundGlyph(5)
}
}
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
167
Erklärung:
• Object RoundGlyph wird im Speicher erzeugt
• Das Objekt „radius“ wird mit 0 initialisiert.
• Der Konstruktor der Superklasse wird aufgerufen.
• Die überschriebene Methode „draw“ wird aufgerufen. Vor
dem Ablauf des Konstruktor der Klasse RoundGlyph!
• Variablen der Klasse RoundGlyph werden initialisiert.
• Rumpf des Konstruktor der Klasse RoundGlyph wird
aufgerufen
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
168
Schlussfolgerung:
• Im Konstruktor einer Klasse sollte alle Attribute möglichst
nur mit Datentypen initialisiert werden.
• Set- und Get-Methoden sollten im Konstruktor vermieden
werden.
• In einfachen Klasse funktioniert dieses.
• In abgeleiteten Klassen kann es zu unvorhergesehenen
Ergebnissen führen.
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
169
Grafische Oberflächen mit Java:
• Java AWT (Abstract Window Toolkit)
- grafische Komponenten, nicht Threadfähig
- abhängig vom Betriebssystem, schnell
• Java SWING
- umfangreiche grafische Komponenten, Nicht immer Threadfähig
- unabhängig vom Betriebssystem, langsam
• Java SWT (Standard Widget Toolkit)
- umfangreiche grafische Komponenten, Threadfähig
- Nicht so umfangreich wie Java Swing
- abhängig vom Betriebssystem, schnell
FB Automatisierung und Informatik: Graphische Nutzerschnittstellen
170
Herunterladen