Java Applikationen, Swing/JFC



Ähnliche Dokumente
Kurs OPR. Objektorientierte Programmierung

GUI Programmierung mit JAVA Swing

Swing Lernen am Code Teil 1

Objektorientierte Software-Entwicklung

NTB Druckdatum:

Grundlagen der Programmierung APPLETS

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

GUI-Programmierung. Teil I. Unterlagen zum Modul OOP mit Java V by MOU2/BFH-TI. Berner Fachhochschule Technik und Informatik

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

GUI Programmierung in Java

Graphische Benutzungsoberflächen

Programmieren II. Java im Vergleich zu anderen Sprachen. Einführung: GUI. Einführung: Grafische Benutzeroberflächen. Dr.

Java I Vorlesung 11 Graphische Oberflächen mit Swing

Objektorientierte Programmierung

Applets. Applets. Applets. Applet: Java-Programm Eingebettet in einer HTML-Seite Ausführung von einem Java-fähigen Web-Browser oder sog.

Kap. 35 Swing: Grundlagen Kap Swing: Hauptfenster

Applications Applets (eingeschränkte Rechte)

Einführung: Grafische Benutzeroberflächen. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 22

Hochschule der Medien Prof. Uwe Schulz 14. Juli 2010 Klausur Informatik, EDV-Nr Seite 1 von 5. Teil 2: Aufgaben

Grafische Benutzeroberflächen mit Swing

Swing :Komponenten I (Teil 2)

Tutorial04: Swing: Erstellen eines JFrames mit einem JSplitPane

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 7. Grafische Benutzeroberflächen 1

GUI Programmierung mit javax.swing

Einstieg in die Informatik mit Java

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Funktionale und Objekt-Orientierte Programmierkonzepte

GRAFISCHE BENUTZERSCHNITTSTELLEN

Einführung in GUI-Programmierung. javax.swing

Institut für Programmierung und Reaktive Systeme. GUIs mit Swing. Markus Reschke

Javakurs für Fortgeschrittene

Java: Vererbung. Teil 3: super()

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Grafikausgabe mit dem Abstract- Windowing-Toolkit. Eine Einführung

...erinnern Sie sich? oopjs4b / kwhbkd4r

tentoinfinity Apps 1.0 EINFÜHRUNG

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

JButton, JCheckBox, JRadioButton. Programmieren II. Vorlesung 7. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2009.

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Benutzeroberflächen. Java Teil 4

Programmieren in Java

Kleines Handbuch zur Fotogalerie der Pixel AG

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

32.4 Anpassen von Menüs und Symbolleisten 795i

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Kap. 36. SWING: Menüs. und weitere SWING-Container. Seán Dempsey

Grundlagen von Python

Java Projekt: Tic Tac Toe + GUI

Einführung in GUI-Programmierung. javax.swing

Programmierkurs Java

2A Basistechniken: Weitere Aufgaben

Swing Grundlagen. Andre Eichmann

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung

Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Dokumentation des Projektes Tic Tac Toe

Installation des Authorware Webplayers für den Internet Explorer unter Windows Vista

Visio Grundlagen. Linda York. 1. Ausgabe, Oktober 2013

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik GUI-Programmierung mit Swing

Artikel Schnittstelle über CSV

Mensch-Maschine-Interaktion

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld "Sharing". Auf dem Bildschirm sollte folgendes Fenster erscheinen:

Objektorientierte Programmierung. Kapitel 12: Interfaces

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Graphical User Interfaces

Programmiertechnik GUI Programmierung mit Java Swing

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Applets Belebung von Webseiten. Dipl.-Ing. Wolfgang Beer

Konfigurationslanleitung für J2EE und Eclipse im KBS-Pool

System-Update Addendum

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

Delegatesund Ereignisse

26. November EFS Übung. Ziele. Zwei Administrator Benutzer erstellen (adm_bill, adm_peter) 2. Mit adm_bill eine Text Datei verschlüsseln

Excel Pivot-Tabellen 2010 effektiv

Installation der Konfigurationsdateien für alle Windows-Versionen bis einschließlich Microsoft Windows 7

Innere Klassen in Java

Das Startmenü. Das Startmenü anpassen

Ziel dieses Kapitels: Einführung in die Grundzüge der Programmierung graphischer Benutzeroberflächen (engl.: "graphical user interface", GUI) in Java

Erstellen eines Screenshot

Java Lab 2006/12/13 Client

Eclipse 3.0 (Windows)

Freigabe der Windows-Firewall und Verknüpfung der Pfade für die Druckvorlagen

Computeria Solothurn

5. Abstrakte Klassen

Transkript:

Java Applikationen, Swing/JFC Applets und Applikationen Kommandozeilen Anwendung Anwendungen mit GUI Swing/JFC Menus Weitere Komponenten Layouts Look & Feel Applets und Applikationen 2 von 70 Einführung Applets Es gibt zwei Typen von Java-Programmen: Applets (eingebettete in Web Seite) Applikationen (eigenständige Programme) Applets wurden für die Anreicherung von HTML Seiten entworfen Erste Anwendung von Java Laufen in einer Sandbox d.h. können i.a. nicht direkt auf Ressourcen (z.b. FileSystem, HW) der Klienten Plattform zugreifen Verbreitung ist am Widerstand von Microsoft gescheitert Müssen in einer HTML-Seite eingebettet sein und benötigen einen Browser oder AppletViewer, um lauffähig zu sein Browser ruft init() und bei Bedarf paint(graphics g, actionperformed(...) etc. auf 1 * Applikationen Auf der Klienten Seite für Plattform unabhängige Anwendungen (JSE) - Java Standard Edition * Auf der Server Seite für die Verarbeitung von Daten (JEE) - Java Enterprise Edition * = mehrmals aufgerufen MeinProgramm.html MeinProgramm.html 3 von 70 4 von 70

Applets Applikationen Applet (mit GUI) Editor Greeting.java Programm Quellcode-Datei Byte-Code-Datei sind eigenständige Programme brauchen keinen Browser oder AppletViewer Greeting.html Compiler Greeting.class javac Greeting.java Weitere Klassen Sie laufen vollständig unabhängig von anderen Programmen Applikationen werden gestartet durch Anklicken eines Icons oder einen entsprechenden Befehl auf der Kommandozeile Applikationen können normalerweise nicht über das Internet gestartet werden Installation (kopieren : Bytecode + JRE + Startverweis) JVM Browser (Applet Viewer) appletviewer Greeting.html JVM = Java Virtual Machine Sie können ebenfalls die AWT-Bibliothek benützen (ausser Applet-Klassen) Applikationen haben mehr Rechte bezüglich dem Zugriff auf lokale Ressourcen (Dateien) kein Sandbox wie beim Applet 5 von 70 6 von 70 Applikationen Editor Programm Quellcode-Datei HelloWorld.java Byte-Code-Datei Kommando: Compiler javac HelloWorld.java Kommandozeilen Anwendung HelloWorld.class Weitere Klassen JVM java HelloWorld JVM = Java Virtual Machine 7 von 70 8 von 70

Kommandozeilen Anwendung Aufruf Applikationen mit Ein-/Ausgabe über die Kommandozeile, Beispiel: (Basic Java Application in Jcreator) public class Gruss { public static void main(string[] args) { System.out.println("Hallo " + args[0]); Aufruf einer Java Kommandozeilen -Applikation: java Klassenname [Argumente] java ruft den Java-Interpreter auf und übergibt ihm als Argument den Namen (=Klassenname) des auszuführenden Programms Der Java-Interpreter interpretiert dann den Byte-Code des Programms Klassenname 1 Die Ausführung des Programms Klassenname beginnt mit der main-methode der Klasse Klassenname Klassenname Name des Programms (= Name der public-klasse) [Argumente] Argumente; werden im String-Array args der Methode main übergeben Die Anzahl der übergebenen Argumente erhält man mit args.length Aufruf: java Gruss (ohne.class) 9 von 70 10 von 70 Eigenschaften Implementation Variante 1 Jede Applikation muss eine Klassenmethode mit der folgenden Signatur enthalten: public static void main(string[] args) {... Diese Methode main ist der Startpunkt der Applikation String[] args ist ein String-Array, der allfällige Argumente von der Kommandozeile enthält; Verwendung via args[0], args[1]... java myapplication arg0 arg1 Werden diese Command Line Arguments nicht verwendet, ist auch diese main- Methode zulässig: public static void main() {... Eine Applikation: public class Applikation { public static void main(string[] args) { tuetwas(); //oder this.tuetwas(); private static void tuetwas() {... Ablauf des Programms: Java-Interpreter ruft die main-methode der Klasse Applikation auf main ruft sodann eine Methode der Klasse auf Klasse Klasse Application Application main() main() { { tueetwas tueetwas tueetwas() tueetwas() 11 von 70 12 von 70

Beispiel Implementation Variante 2 Klasse wird nicht instanziert. Programm spielt sich direkt in der Klasse ab. Methode main ist das Hauptprogramm Alle Methoden und nicht lokale Variablen müssten als static deklariert werden public class BasicJavaAppl { public static void main(string[] argumente) { for (String s : args) { // iteriere durch alle Arrayelemente System.out.println(s); int a = Integer.parseInt(args[0]); int res = tuetwas(a); System.out.println("Quadrat von " + a + " = " + res); Aufbau der Applikation: public class Applikation { public static void main(string[] args) { Applikation a = new Applikation(); a.tuetwas(args); private void tuetwas() {... Ablauf des Programms: Java-Interpreter ruft die main-methode der Klasse Applikation auf main erzeugt eine Instanz der Klasse (eigenen) Applikation main ruft sodann eine Methode im erzeugten Objekt auf Klasse Klasse Application Application main() main() { { a= a= new new.. a.tuetwas(); a.tuetwas(); tuetwas() tuetwas() Instanz von Application Instanz von Application Var Var a a main() main() tuetwas() tuetwas() private static int tuetwas(int x){ return x*x; Diese Variante ist zu bevorzugen 13 von 70 14 von 70 Beispiel Übungsaufgabe main wird nur für die Instanzierung verwendet Klasse wird in main instanziert. Nur main muss als static deklariert werden. public class BasicJavaAppl { public static void main(string[] argumente) { a = new BasicJavaAppl(); a.tuetwas (argumente); Schreiben Sie ein Adder-Programm, das die Eingaben der Kommandozeile zusammen zählt und ausgibt: java Adder 34 23 21 sollte als Resultat diesen Output liefern: 78 private void tuetwas(string[] args){ //Constructor for (String s : args) { // iteriere durch alle Arrayelemente System.out.println(s); int a = Integer.parseInt(args[0]); int res = a*a; System.out.println("Quadrat von " + a + " = " + res); 15 von 70 16 von 70

Applikationen mit GUI (Graphical( User Interface) Anwendungen mit GUI Im Applet ist die Klasse Applet selbst schon ein Fenster GUI-Element Eine GUI Applikation muss dieses selber erstellt werden Die Klasse Frame (Abstract Window Toolkit (AWT) ) diese Aufgabe class MyFrame extends Frame Klasse Frame: Verwaltet ein Fenster mit Scrollbars, Menubalken und Window-Controls Ein Frame kann WindowEvents erzeugen WindowListener benötigt Object Component Container Behälter für andere Behälter für andere Komponenten: add( ) Komponenten: add( ) Panel Window Applet Frame Dialog auf dem Desktop darstellbar auf dem Desktop darstellbar 17 von 70 18 von 70 Applikationen mit GUI Klasse MyFrame erbt von Frame Erzeuge Instanz von MyFrame Öffne MyFrame with setvisible(true) Add a Window Listener in Construktor Beenden der Application mit System.exit(0) import java.awt.*; import java.awt.event.*; public MyFrame(String name) { super(name); this.addwindowlistener ( new WindowAdapter() { public void windowclosing(windowevent e){ System.exit(0); ); Frames und WindowEvents public class MyFrame extends Frame { public static void main(string[] args) { // Create application frame. MyFrame frame = new MyFrame("TestJFC"); // Show frame frame.setsize(new Dimension(400, 400)); frame.setvisible(true); 19 von 70 20 von 70

Frame WindowEvents Konstruktoren: Frame() erzeugt ein Fenster ohne Titel Frame(String Fenstertitel) erzeugt ein Fenster mit Titel Wichtige Methoden (zum Teil von Klasse Window geerbt): setsize(int b,int h) setzt Fenstergrösse show() macht Fenster sichtbar setvisible(boolean b) macht Fenster un-/sichtbar toback() schiebt Fenster nach hinten tofront() schiebt Fenster nach vorne validate(); ordnet Elemente in Fenster neu an settitle(string titel) setzt Fenstertitel (kann auch in Contructor gemacht werden) setmenubar(menubar m) setzt neue Menuleiste des Fensters Ein Frame kann WindowEvents erzeugen; die Applikation muss WindowListener Interface implementieren um darauf reagieren zu können: public void windowopened(windowevent event)wird aufgerufen, nachdem das Fenster das erste Mal sichtbar geworden ist public void windowclosing(windowevent event)wird aufgerufen, wenn der Benützer das Fenster schliessen möchte public void windowclosed(windowevent event)wird aufgerufen, sobald Fenster effektiv geschlossen ist public void windowiconified(windowevent event)wird aufgerufen, nachdem das Fenster zu einem Icon verkleinert worden ist public void windowdeiconified(windowevent event)wird aufgerufen, sobald der Benützer das Icon wieder geöffnet hat public void windowactivated(windowevent event)wird aufgerufen, sobald das Fenster aktiv ist, d.h. den Fokus erhält public void windowdeactivated(windowevent event)wird aufgerufen, sobald Fenster inaktiv geworden ist, d.h. den Fokus abgegeben hat 21 von 70 22 von 70 PlayBalloon Applet vs Applikation PlayBalloon Applet vs Applikation import java.awt.*; import java.awt.event.*; public class PlayBalloon extends Frame implements ActionListener, WindowListener { private Button grow, shrink; private Balloon myballoon; public static void main(string[] args) { PlayBalloon f = new PlayBalloon(); f.setsize(300,300); f.setvisible(true); public PlayBalloon() { // Constructor kreiert u.a. GUI settitle("balloon"); setlayout(new FlowLayout()); // Default Layout for Frame = Border! grow = new Button("Grow"); add(grow); grow.addactionlistener(this); shrink = new Button("Shrink"); add(shrink); shrink.addactionlistener(this); myballoon = new Balloon(20, 50, 50); this.addwindowlistener(this); 23 von 70 public void actionperformed (ActionEvent event) { // wie beim Applet if (event.getsource() == grow){ myballoon.changesize(10); if (event.getsource() == shrink){ myballoon.changesize(-10); repaint(); Adapter verwenden! Adapter verwenden! public void windowclosing(windowevent event) { // WindowListener!! System.exit(0); public void windowiconified(windowevent event) { public void windowopened(windowevent event) { public void windowclosed(windowevent event) { public void windowactivated(windowevent event) { public void windowdeiconified(windowevent event) { public void windowdeactivated(windowevent event) { public void paint (Graphics g) { // gleich wie beim Applet myballoon.display(g); School of Engineering A. Meier/M. Braschler/J. Zeman/K. Rege 24 von 70

PlayBalloon Applet vs Applikation Umwandlung Applet in eine Applikation unverändert unverändert public class Balloon { private int diameter, xcoord, ycoord; public Balloon (int initialdiameter, int initialx, int initialy){ diameter = initialdiameter; xcoord = initialx; ycoord = initialy; public void changesize (int change) { diameter = diameter+change; public void display (Graphics g) { g.drawoval (xcoord, ycoord, diameter, diameter); Methode init() in einen Konstruktor (d.h. gleicher Name wie Klasse) ohne Parameter umwandeln extends Applet durch extends Frame ersetzen und import Applet löschen main-methode schreiben: public static void main(string[] args) muss ein Objekt der eigenen Klasse (d.h. des Programms) erzeugen damit wird das entsprechende Frame erzeugt muss Grösse der Frames setzen mit setsize(breite, hoehe); muss Frame sichtbar machen mit setvisible(true); WindowListener implementieren via Adapter! via Adapter! Deklarierung der 7 WindowListener Methoden Implementierung mindestens der windowclosing Methode Applikation bei sich selbst als WindowListener Registieren this.addwindowlistener(this); Layout-Manager auf FlowLayout ändern, falls gewünscht Kontrollieren, ob keine Methoden der Applet-Klasse mehr verwendet werden Alternative bei JFC siehe Alternative bei JFC siehe Anhang Anhang 25 von 70 26 von 70 Swing Oberflächen (JFC) Neben AWT die zweite Bibliothek von GUI Komponenten: Swing/JFC Java Foundation Classes nicht unabhängig voneinander JFC/Swing teilen z.b. Events, Layout Manager etc. Komponenten sollten nicht gemischt werden 27 von 70 28 von 70

Vergleich JFC/Swing und AWT Vergleich JFC/Swing und AWT AWT Eigenschaften ist älter braucht weniger Ressourcen einfach aufgebaut Komponenten passen sich automatisch Umgebung an (Konzept der Peers "Gegenüber" auf allen Plattformen) Nachteile: beschränkt in Funktionsumfang kleinster-gemeinsamer-nenner Ansatz (z.b. bei Maustasten) Swing/JFC Eigenschaften moderner, sieht besser aus kann mehr mehr Komponenten Unterstützung von D&D, Clipboard unterstützt erweiterbares Komponentenmodell: Java Beans Plattform independent and native Look-and-Feel Wechsel von AWT zu Swing ist einfach Nachteile braucht etwas mehr Ressourcen AWT Importieren von Klassen import java.awt.*; import java.awt.event.*; Komponenten aber Frame Button TextField List Verwendung Frame add() Applet app = new Applet(); Button but = new Button(); app.add(but); Swing Import von Klassen import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; Komponenten JFrame JButton JTextField aber JList (anders aufgebaut) JTable (neu) Verwendung JFrame add() JApplet app = new JApplet(); JButton but = new JButton(); app.add(but); 29 von 70 30 von 70 JFC Klassenhierarchie (vereinfacht) Object Component Container gemeinsame Oberklasse gemeinsame Oberklasse (auch für AWT) (auch für AWT) "Behälter" "Behälter" für für andere andere Komponenten Komponenten einfache JFC Komponenten JComponent Oberklasse für eigene JFC Oberklasse für eigene JFC Komponenten (kein Canvas mehr) Komponenten (kein Canvas mehr) Window Menus JButton JScrollbar JLabel JMenu JCheckBox JRadioButton JTextComponent JTextField JTextArea JPanel Hilfsklassen zur Anordnungssteuerung FlowLayout BorderLayout BoxLayout JApplet JFrame JDialog auf dem Desktop darstellbare Behälter 31 von 70 32 von 70

Menus Menus Applikationen können im Gegensatz zu Applets neben den anderen GUI- Komponenten auch Menus enthalten Dazu braucht es eine sogenannte Menuleiste (JMenubar) an dieser Leiste sind die Menus aufgehängt sind MenuItem: so heissen die einzelnen Einträge eines Menus (können selbst wieder Untermenus sein) JComponent JMenuBar: Leiste, an der die Menus aufgehängt sind JMenu einzelne Einträge in Menübar JMenuItem: einzelne Einträge eines Menus Klassen: JMenuBar JMenu JMenuItem Klassenhierarchie: JMenuItem JMenuBar JMenu 33 von 70 34 von 70 Klasse JMenuBar Klasse JMenu Konstruktor JMenuBar() Nützliche Methoden add(jmenu menu) Werden mittels der Frame-Methode setmenubar(jmenubar menuleiste) zu einem Frame hinzugefügt Klasse JMenu ist eine Unterklasse von JMenuItem: Konstruktor: JMenu(String label) erzeugt JMenu mit Titel label Nützliche Methoden JMenuItem add(jmenuitem item) fügt JMenuItem item zum JMenu add(string label) erzeugt JMenuItem label und fügt es ans Ende des Menus an (MenuItem wird zurückgegeben) addseparator() fügt einen Separator ans JMenu an insert(jmenuitem item, int pos) fügt Item item an der Stelle pos ins JMenu ein insertseparator(int pos) fügt Separator an der Stelle pos ein 35 von 70 36 von 70

Klasse JMenuItem JMenuItem Methoden erzeugt einen ActionEvent, falls das betroffene JMenuItem ausgewählt wird und aktiv ist Es muss nicht bei jedem JMenuItem ein ActionListener registriert sein Es kann auch nur ein Listener beim JMenu selbst registriert sein Die ActionEvents eines Items werden dann zum darüber liegenden JMenu propagiert Konstruktoren: JMenuItem(String label) erzeugt ein JMenu-Item label JMenuItem(String label, MenuShortCut shortcut) erzeugt ein JMenu-Item label mit der zugeordneten Tastenkombination shortcut boolean isenabled() gibt zurück, ob JMenu-Item aktiv ist setenabled(boolean b) aktiviert oder deaktiviert ein JMenu-Item String getlabel() gibt Label des JMenu-Items zurück setlabel(string name) setzt Label des JMenu-Items auf name addactionlistener(actionlistener o) registriert Object o als Listener setactioncommand(string command) setzt Befehlsname des JMenu-Items auf command (dieser kann aus dem ActionEvent-Objekt mit getactioncommand() ausgelesen werden) MenuShortcut getshortcut() gibt Shortcut des JMenu-Items zurück setshortcut(menushortcut c) setzt Shortcut des JMenu-Items auf c 37 von 70 38 von 70 Menus Verwendung Menus Event-Behandlung Diese Objekte erzeugen keine JMenu-Events setmenubar() JFrame JMenuBar menubar.add() movemenu.add() JMenu JMenuItem JMenuItem JFrame JMenuBar JMenu rightitem.addactionlistener() JMenuItem JMenuItem JMenu JMenuItem JMenuItem JMenu JMenuItem JMenuItem JMenu JMenu 39 von 70 40 von 70

7 Schritte, um eine Menuleiste zu erzeugen: Beispiel: PlayBalloon Applikation mit Menus 1. Neue Menuleiste erzeugen: JMenuBar menubar = new JMenuBar(); 2. Neues JMenu erzeugen: JMenu menuname = new JMenu( menutitel); 3. Neuen Menueintrag erzeugen und ins JMenu einfügen: JMenuItem einitem = new JMenuItem(itemName); menuname.add(einitem); Objekt als Listener des entsprechenden JMenu-Item-Events anmelden: einitem.addactionlistener(this); 4. Schritt 3 für alle JMenuItems wiederholen 5. JMenu zu Menuleiste hinzufügen: menubar.add(menuname); 6. Schritte 2 4 für alle Menus wiederholen 7. MenuLeiste in Frame einfügen: setmenubar(menubar); Umwandlung der PlayBalloon Applikation: Menus statt Buttons Code siehe Anhang 41 von 70 42 von 70 Ein oder mehrfache Auswahl: JCheckBox Kleine Auswahl weiterer Komponenten ermöglicht (mehrfache) Auswahl aus einer (Check-)Liste. Eine JCheckBox hat einen Zustand -> ausgewählt oder nicht Erzeugung (Instanzierung): JCheckBox one = new JCheckBox ("one"); erzeugt eine JCheckBox mit Label "Cola" JCheckBox two = new JCheckBox ("two",true); erzeugt gleiche JCheckBox wie oben, die aber bereits ausgewählt ist Hinzufügen Listener registrieren: one.additemlistener(this); Behandlung der Events: muss ItemListener sein muss Methode public void itemstatechanged(itemevent e) zur Verfügung stellen Nützliche Methoden von JRadioButton-Objekten: String gettext() gibt Label der JCheckBox zurück boolean isselected() Zustand der JCheckBox (selektiert oder nicht) settext(string str) Setzt Label einer JCheckBox auf str setselected(boolean sel) Selektiert oder deselektiert 43 von 70 44 von 70

RadioButton: JRadioButton Auswahl: JComboBox Es kann maximal ein Schalter einer Schaltergruppe eingeschaltet sein Instanzierung: one = new JRadioButton("one"); two = new JRadioButton("two"); ButtonGroup group = new ButtonGroup(); group.add(one); grous.add(two); Erzeugt eine Schaltergruppe c und einen Schalter red mit dem Label "one", der eingeschaltet ist. ButtonGroup wird nur bei Deklaration gebraucht Liste von Auswahlmöglichkeiten, von denen man eine auswählen kann. Erzeugung: JComboBox colourchoice = new JComboBox(); Hinzufügen: colourchoice.additem("rot"); colourchoice.additem("grün"); Behandlung der Events: Applet muss ActionListener sein Methoden des ActionEvent-Objekts: Object getsource() gibt JComboxBox zurück, die Ereignis erzeugte Object getselecteditem() gibt Item (als String) zurück, das Ereignis erzeugte Bsp: if (e.getsource() == colorchoice) { String achoice = (String)e.getSelectedItem(); -> achoice enthält schliesslich den String des angewählten Items 45 von 70 46 von 70 Und viele andere mehr... Dialoge http://java.sun.com/docs/books/tutorial/uiswing/components/index.html 47 von 70 48 von 70

Dialoge: JDialog Standard Dialoge, z.b. JFileChooser Kleine Fenster für Meldungen und Benutzer(nach)fragen können modal zu anderem Window sein, d.h. parent Window lässt keine Eingabe zu solange JDialog sichtbar. Konstruktoren: JDialog(JFrame Parent); JDialog(JFrame parent, String title); wichtige Methoden resize(int breite, int hoehe) setzt Fenstergrösse show() macht JDialog sichtbar setvisible(boolean b) macht un- /sichtbar setmodal(boolean b) setzt Modalität des Dialogs class MyDialog extends JDialog implements ActionListener { JButton yes,no; boolean _yes; MyDialog (JFrame f, String name) { super(f, name); resize(200,100); setlayout (new FlowLayout()); yes = new Button("yes"); no = new Button("no"); yes.addactionlistener(this);; no.addactionlistener(this); this.setmodal(true); add(yes); add(no); public boolean yespressed() {return _yes; public void actionperformed (ActionEvent e) { _yes = e.getsource() == yes; setvisible(false); 49 von 70 erzeugt Dialog-Fenster, um ein File auszuwählen Deklaration: private JFileChooser fc; Initialisierung: fc = new JFileChooser(); int returnval = fc.showopendialog(this); oder int returnval = fc.showsavedialog(this); Verarbeitung: if (returnval == JFileChooser.APPROVE_OPTION) {.// ok else {System.out.println("canceled"); Name des ausgewählten Files: filename = fc.getselectedfile().getname(); Pfad des ausgewählten Files: path = fc.getselectedfile().getpath(); Weitere Einstellungsmöglichkeiten Filter, Directory, Standard Dialogbox JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.", "Inane error",joptionpane.error_message); http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html 50 von 70 Übung Erstellen Sie einen modalen JDialog, zur Anzeige einer Fehlermeldung, die durch Drücken eines ok-knopfes geschlossen werden kann. Anordnungsverwalter 51 von 70 52 von 70

Anordnungsverwalter Flussanordnung: FlowLayout Komponenten eines GUI werden i.d.r. nicht von Hand ausgerichtet, da aufwendig und wenig flexibel Swing definiert zu diesem Zweck verschiedene Layout-Manager die bestimmen, wie die Komponenten ausgelegt werden Die Frame/Panel Methode validate ordnet die Komponenten entsprechend an (nötig falls Komponenten zur Laufzeit hinzugefügt wurden) Die wichtigsten Layout-Manager: FlowLayout: in der Mitte zentriert; Default für Applets BorderLayout: in 5 Regionen unterteilt GridLayout: GUI Kompontenten in Raster angeordnet GridBagLayout: Raster angeordnet mit Constraints http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html Default für Applets Komponenten in einer Reihe von links nach rechts zentriert zum Fenster, Reihenfolge entspricht den add()- Befehlen Erzeugung: FlowLayout layout = new FlowLayout(); FlowLayout, Reihen zentriert FlowLayout layout= new FlowLayout(FlowLayout.LEFT); FlowLayout, Reihen linksbündig Layout setzen setlayout(layout); public void init() { setlayout(new FlowLayout()); add(new Button("Ok")); add(new Button("Open")); add(new Button("Close")); 53 von 70 54 von 70 Anordnung an den Rändern: BorderLayout MatrixAnordnung: GridLayout Default bei eigenständigen Anwendungen Komponenten entlang der Fensterseiten teilt das Fenster in 5 Felder ein: North, South, East, West, Center Nur eine Komponente pro Feld möglich Randfelder werden zuerst angelegt. Feld Center belegt sodann den verbleibenden Platz So füllen z.b. Schieberegler immer ganze Seitelänge aus Erzeugung BorderLayout layout = new BorderLayout(); Borderlayout ohne Zwischenräume zwischen den Komponenten BorderLayout layout = new BorderLayout(10,20); Borderlayout mit 10 Pixel horizontaler und 20 Pixel vertikaler Zwischenraum zwischen den Komponenten Layout setzen: setlayout(layout); oder direkt setlayout(new BorderLayout()); public void init() { setlayout(new BorderLayout()); add(borderlayout.north,new Button("North")); add(borderlayout.south,new Button("South")); add(borderlayout.west,new Button("West")); add(borderlayout.east,new Button("East")); add(borderlayout.center,new Button("Center")); Komponenten Reihen- und Kolonnenweise anordnen Reihenfolge entspricht den add()- Befehlen (Leserichtung l.r.o.u) Erzeugung: GridLayout layout = new GridLayout(int rows, int cols); rows = -1 -> beliebige Anzahl Reihen GridLayout layout = new GridLayout(int rows, int cols, int hgap, int vgap); wie oben aber mit Abstand zwischen den Komponenten Layout setzen setlayout(layout); public void init() { setlayout(new GridLayout(-1,2)); add(new Button("1")); add(new Button("2")); add(new Button("3")); add(new Button("4")); add(new Button("5")); add(new Button("6")); 55 von 70 56 von 70

Komponentenbehälter Basis: Container Ist abstrakte Oberklasse aller Komponenten, die andere Komponenten enthalten können (Bsp. JComponent, JPanel) Container (und Unterklassen) können selber in Container eingebettet sein Container Behälter Die wichtigsten Methoden sind: JPanel setlayout(layoutmanager layout) setzt den Layout-Manager der Komponente auf layout add(component komponente) fügt die Komponente komponente zur aktuellen Komponente hinzu remove(component komponente) entfernt Komponente komponente von aktueller Komponente validate() Führt einen neuen Layout aus unter Verwendung des aktuellen Layout- Managers (nötig, nachdem einzelne Komponenten unsichtbar/sichtbar gemacht wurden) 57 von 70 58 von 70 Konkreter Behälter: JPanel Übung Komponente, die zur Gruppierung von anderen Komponenten dient Komponenten innerhalb eines JPanels werden gemäss dem entsprechenden Layout-Manager angeordnet ist eine Unterklasse der Klasse Container Erstellen sie mit den bekannten Anordnungsverwaltern und Elementen (inkl. Panel) ein GUI, das wie untenstehendes Beispiel aussieht. Vorgehen, um Komponenten mit JPanel zu gruppieren: JPanel erzeugen Komponenten zu JPanel hinzufügen Panel zu anderen Container hinzufügen Erzeugung JPanel p1 = new JPanel(new BorderLayout()) erzeugt ein Panel mit BorderLayout-Manager JPanel p2 = new JPanel(new FlowLayout(FlowLayout.RIGHT)) erzeugt Panel mit LayoutManager Komponenten zu Panel hinzufügen button b1 = new Button("button 1"); button b2 = new Button("button 2"); p2.add(b1); p2.add(b2); p1.add(borderlayout.south,p2); 59 von 70 60 von 70

Look and Feel Plattform unabhängig Die Anwendung soll unabhängig von der Plattform gleich aussehen try {UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); catch (Exception e) {System.out.println("L&F not found"); Look and Feel Plattform abhängig Die Anwendung soll sich wie eine "native" Anwendung auf der entsprechenden Plattform aussehen. try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); catch (Exception e) {System.out.println("L&F not found"); Nimbus Nimbus 2000 2000 Einstellung in main() noch bevor das erste Fenster geöffnet wird 61 von 70 62 von 70 Plattformunabhänge Look and Feel Nativer Look And Feel Plattformunabhänge Look and Feels Angepasst an jeweilige Plattform Metal (Default) and Nimbus Look and Feel XP, Vista, Win 7, Mac "javax.swing.plaf.metal.metallookandfeel" "com.sun.java.swing.plaf.nimbus.nimbuslookandfeel" 63 von 70 64 von 70

Zusammenfassung Anhang: JFC Klassenbibliothek Applets und Applikationen Kommandozeilen Anwendung Anwendungen mit GUI JFC/Swing JMenu Weitere Komponenten Layouts Look & Feel 65 von 70 66 von 70 JFC Klassenbibliothek Anhang: PlayBalloon Applikation mit Menus public class MenuBalloon extends JFrame implements ActionListener, WindowListener { private Balloon myballoon; private JMenuItem growitem, shrinkitem; private JMenuItem leftitem, rightitem; public static void main(string[] args) { MenuBalloon f = new MenuBalloon(); f.setsize(300,300); f.setvisible(true); public MenuBalloon() { settitle("balloon"); setlayout(new FlowLayout()); JMenuBar menubar = new JMenuBar(); JMenu sizemenu = new JMenu("Size"); growitem = new JMenuItem("Grow"); sizemenu.add(growitem); growitem.addactionlistener(this); // Fortsetzung Constructor shrinkitem = new JMenuItem("Shrink"); sizemenu.add(shrinkitem); shrinkitem.addactionlistener(this); menubar.add(sizemenu); JMenu movemenu = new JMenu("Move"); leftitem = new JMenuItem("Left"); movemenu.add(leftitem); leftitem.addactionlistener(this); movemenu.addseparator(); rightitem = new JMenuItem("Right"); movemenu.add(rightitem); rightitem.addactionlistener(this); menubar.add(movemenu); setjmenubar(menubar); myballoon = new Balloon(20, 50, 50); this.addwindowlistener(this); 67 von 70 68 von 70

Anhang:...PlayBalloon Applikation mit Menus Anhang: Beenden von JFC Anwendungen public void actionperformed (ActionEvent event) { if (event.getsource() == growitem){ myballoon.changesize(10); if (event.getsource() == shrinkitem){ myballoon.changesize(-10); if (event.getsource() == leftitem){ myballoon.moveleft(); if (event.getsource() == rightitem){ myballoon.moveright(); repaint(); public void paint (Graphics g) { myballoon.display(g); public void windowclosing(windowevent event) {. // // windows listener Methoden // end class MenuBalloon Menü-Elemente (Items) Menü-Elemente (Items) Reagieren auf Windows Event Mittels WindowListener(wie AWT) System.exit(0) bei Closing Event von Fenster aufrufen meist als anonyme Klasse implementiert this.addwindowlistener ( new WindowAdapter() { public void windowclosing(windowevent e){ System.exit(0); Mittels defaultclosingoperation Eigenschaft des JFrames festlegen frame.setdefaultcloseoperation(jframe.exit_on_close) Public class Balloon { gleich wie vorher ); 69 von 70 70 von 70