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