Grafische Benutzeroberflächen mit Swing

Slides:



Advertisements
Ähnliche Präsentationen
programmiert April-Juni 2003 von Knut Riechmann
Advertisements

der Universität Oldenburg
Strategie (Strategy / Policy) Ein objektbasiertes Verhaltensmuster Stephan Munkelt, Stefan Salzmann - 03IN.
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Ein Beispiel in Java.
Java – Swing Vortrag von Raphaela Wrede und Anja Jentzsch
Praktikum Systementwicklung
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Programmierung grafischer Oberflächen
Threads Richard Göbel.
Java: Objektorientierte Programmierung
Java: Programmierung grafischer Oberflächen
MVC.
AUFGABE 1: Ein Wagen (dargestellt durch ein Rechteck) soll sich von links nach rechts bewegen. Tipp: Timer benutzen AUFGABE 2: Zusätzlich zu Aufgabe.
Wie überwacht man Objekte im "Alltag" ?. Indem man "Wanzen" an diese anbringt.
Ein Beispiel in Java.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 6 Model-View-Controler als Grundlage für Nutzerschnittstellen Sommersemester 2003 Lars Bernard.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 7 User Interfaces in Java Sommersemester 2003 Lars Bernard.
AWT – Detailbetrachtung Java 3D – Seminar im Wintersemester 2002/2003 Christian Schneider.
Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag Einführung in die Programmierung mit.
Programmieren mit JAVA
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
DVG1 - Applets1 Applets. DVG1 - Applets2 Die Klasse Applet n Applets sind Grafikobjekte, die unter Steuerung eines anderen Programms (z.B. eines Browsers,
DVG Einführung in Java1 Einführung in JAVA.
SWING DVG Swing.
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
SWING DVG Swing.
03 - Paint Das Zeichenprogramm EMMA Paint2 Aufgabenstellung Entwicklung eines ausschließlich in JAVA programmierten Graphikprogrammes. Vergleichsprodukte:
© 2002 Dr. Cavelius - Ley - Pohlig - Taulien Step by step zum JFrame 1 Zum JFrame Step by step by step by step by step by step by step by step by.
© 2005 Pohlig GK Informatik K Zum JFrame Step by step by step by step by step by step by step by step by.
© 2006 MPohlig Grundkurs Informatik mit Java 1 JFrame-Vorlage Step by step by step by step by step by step by step by step by.
© 2004 Pohlig - Taulien Swing Ereignissteuerung. © 2004 Pohlig - Taulien GK Informatik mit Java 2 Auf Button-Klick reagieren.
FH-Hof Java2D - Grundlagen Richard Göbel. FH-Hof Java2D - Funktionen Java2D unterstützt: das Zeichnen von Grafiken die Darstellung von Texten die Darstellung.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 6 Sitzung 6: Model-View-Controller als Grundlage.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 7 Sitzung 7: User Interfaces in Java.
Universität zu Lübeck Institut für Informationssysteme Die Präsentationsschicht - mit Swing.
Erste Schritte mit Eclipse Neues Projekt erstellen (1)
AWT und JFC Abstract Windowing Toolkit
Applets Java für’s Web.
Java: Programmierung grafischer Oberflächen
Aufgaben Version 1: Es soll eine Wetterstation mit folgenden zwei Anzeigen implementiert werden: Aktuelle Wetterbedingungen mit Temperatur und.
Wilfried Imrich CuP - Java Erste Vorlesung Entspricht ungefähr Kapitel 1.1 des Skriptums Wilfried Imrich Montanuniversität Leoben Freitag, 4. Oktober 2002.
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Javelin Internet-based parallel computing using Java.
Programmiervorkurs WS 2014/15 Methoden
© 2005 Pohlig Informatik Jg. 11 mfH Michael Pohlig 1 Zum JFrame Step by step by step by step by step by step by step by step by.
Java-Kurs Übung Benutzeroberflächen und Graphik Frames (Fenster)
Java-Applets und URLs APP Philip Graf, Andreas Bößl.
Threads in Java Threads  Sprachumfang von Java Der Java-Standard fordert nur die Unterstützung von Thread-Prioritäten. Es gibt keine Forderung bzgl.:
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
Einführung in die OOP in Java
GUI Programmierung in Java Branimir Djordjevic. GUI - Wichtige Begriffe -  Die Swing-Bibliothek in Java stellt zum Beispiel die folgenden Windows zur.
Java Programme nur ein bisschen objektorientiert.
Grafische Benutzeroberflächen mit Swing (2) Christoph Broschinski, Alexander Sczyrba Jan Krüger
Verwendung von Graphical-User-Interfaces der Bibliothek: javax.swing.*
Java I/O Input / Output stream Library
Wie überwacht man Objekte im "Alltag" ?
Praktische Informatik 1
Das Entwurfsmuster Model-View-Controller
Abstract Windowing Toolkit
Abstract Windowing Toolkit
Praktische Informatik 1
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Programmiermethodik Übung 7
Implementieren von Klassen
Informatik Softwareentwicklung – 4.3 Entwurfsmuster
 Präsentation transkript:

Grafische Benutzeroberflächen mit Swing Nils Hoffmann hoffmann@cebitec.uni-bielefeld.de Jan Krüger jkrueger@techfak.uni-bielefeld.de

Organisatorisches Freitags , 6.6.2008 (12 – 14 Uhr) in H7 1. Teil Überblick über Java/Swing Designpattern : MVC 2. Teil Ereignissteuerung in Java/Swing Einführung in Threads Dienstags, 10.6.2008 (12 – 14 Uhr) GZI (V2- 222, V2-229 und V2-234) Übung : ein Taschenrechner mit JFC/Swing richtet sich an Java/JFC/Swing Einsteiger V2-221 V2-240 V2-229

Übersicht Historisches AWT vs. JFC/Swing leicht- und schwergewichtige Elemente Applet vs. WebStart vs. Application Sicherheitskonzepte in Java / Sandbox DesignPattern : MVC Beispiel Swing : Komponenten, Layouts, Ereignisse Threads

Historisches (1) Java 1.0 (1996) AWT (AbstractWindowToolkit) package java.awt.* Java 1.1 (1997) OO- Ereignissteuerung, JFC/Swing als Erweiterung package javax.swing.* seit Java 1.2 (1998) JFC/Swing als Standard GUI

Historisches (2) AWT JFC/Swing nur wenige Komponenten Thread-sicher kein MV Prinzip HeavyWeight unzählige Komponenten erweiterbar nicht Thread-sicher MV Prinzip skinable LightWeight

LightWeight vs. HeavyWeight keine direkte Repräsentation im UI plattformunabhängig aber : keine plattformspezifischen Komponenten Erscheinungsbild kann während der Laufzeit und unabhängig vom System geändert werden (skinable) einfach erweiterbar

Applet, Webstart und Applikation Browser javaws java JVM Live Demo zur Veranschaulichung RNAMovies als Beispiel fuer eine Applikation die sowohl Applet, Applikation als auch Webstartapplikation ist http://bibiserv.techfak.uni-bielefeld.de/rnamovies Unterschiede erklaeren Sandbox Applet WebStart Application

Designpattern ModelViewController verschiedene Darstellungen verschiedene aber teilweise doch aehnliche Steuerung gleiches (aehnliches) Datenmodell

Modell (Model) Datenfelder Logik (Funktionen) Model View Controller Modell (model) enthält die abzubildenen Daten und i.d.R. die Geschäftslogik Geschäftslogik entspr. den (Objekt-)Funktionen/Methoden Fragen : Welche Daten muss mein Modell beinhalten ? Was will ich modellieren ? Welche Funktionen brauche ich um die Daten des Modells zu manipulieren ? An der Tafel (Beispiel Taschenrechner) : Welchen Daten braucht ein Taschenrechner ? Operand1, Operand2, Operator, Ergebnis Welche Methoden braucht ein Taschenrechner ? berechne(), setOperand1, setOperand2, setOperator, getErgebnis() View Controller

Repräsentation (View ) Darstellung des Modells Benutzerinteraktion Model Darstellung der Daten Entgegennahme von Benutzeraktionen Aber : Keine Verarbeitung der Ereignisse View Controller

Steuerung (Controller) Benutzeraktion auswerten Aktion ausführen Präsentation ändern Model verwaltet die Präsentation nimmt von der Präsentation Ereignisse entgegen, wertet diese aus und agiert entsprechend “Kennt” Modell und Repräsentation View Controller

Ein Fenster zur Welt import javax.swing.JFrame; public class HelloSwingFrame { public static void main(String[] args) { JFrame f = new JFrame("Das Fenster zur Welt!"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(300,200); f.setVisible(true); }

Klassenhierachie javax.swing.* java.awt.* Canvas Panel TextComponent JTextComponent Component Container JComponent JPanel Button AbstractButton CheckBox Window JWindow Frame JFrame java.awt.*

Buttons JButton JToggleButton JCheckBox AbstractButton JRadioButton JMenuItem JMenu JCheckBoxMenuItem JRadioButtonMenuItem

JButton import javax.swing.JButton; import javax.swing.JFrame; public class Beispiel_JButton { public static void main(String [] args){ JFrame f = new JFrame("Das Fenster zur Welt!"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new JButton("Ich bin ein JButton!")); f.setSize(300,200); f.setVisible(true); }

JTextComponent JTextComponent Text Controls Plain Text Areas Styled Text Areas JTextArea JEditorPane JTextField JTextPane JFormattedTextField JPasswordField

JTextField import javax.swing.JFrame; import javax.swing.JTextField; public class Beispiel_JTextField { public static void main(String[] args) { JFrame f = new JFrame("Das Fenster zur Welt!"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new JTextField("Ich bin ein JTexfield!",60)); f.setSize(300,200); f.setVisible(true); }

JLabel import javax.swing.JFrame; import javax.swing.JLabel; public class Beispiel_JLabel { public static void main(String[] args) { JFrame f = new JFrame("Das Fenster zur Welt!"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new JLabel("Ich bin ein JLabel!",60)); f.setSize(300,200); f.setVisible(true); }

JPanel Behälter für andere JComponenten (JPanel, JButton, JTextField, ...) JPanel zeichnet nur seinen Hintergrund benutzt einen LayoutManager um JComponenten im JPanel anzuordnen typische Anwendung : Positionieren von JComponenten

Layout : FlowLayout ... public class Beispiel_FlowLayout extends JPanel{ public Beispiel_FlowLayout(){ for(int i = 1; i <= 5; ++i){ add(new JButton("Button "+(Math.pow(10, i)))); } public static void main(String[] args) { JFrame f = new JFrame("FlowLayout"); f.add(new Beispiel_FlowLayout()); f.pack(); f.setVisible(true);

Layout : BorderLayout ... public class Beispiel_BorderLayout extends JPanel{ public Beispiel_BorderLayout(){ setLayout(new BorderLayout()); add(new JButton("Norden"),BorderLayout.NORTH); add(new JButton("Westen"),BorderLayout.WEST); add(new JButton("Osten"),BorderLayout.EAST); add(new JButton("Süden"),BorderLayout.SOUTH); add(new JButton("Mitte"),BorderLayout.CENTER); }

Layout : GridLayout ... public class Beispiel_GridLayout extends JPanel { public Beispiel_GridLayout(){ setLayout(new GridLayout(3,3)); for (int i = 9; i >= 1; --i){ add(new JButton(new Integer(i).toString())); }

Layout : BoxLayout ... public class Beispiel_BoxLayout extends JPanel { public Beispiel_BoxLayout(){ this(BoxLayout.X_AXIS); } public Beispiel_BoxLayout(int direction){ setLayout(new BoxLayout(this, direction)); for(int i = 1; i <=5; ++i){ add(new JButton(new Integer(i).toString()));

Ereignissteuerung eine Komponente kann ein Ereignis (Event) auslösen jedes Event wird durch eine Klasse repräsentiert (z.B. ActionEvent) ein Event kann durch ein oder mehrere Listener verarbeitet werden JComponents haben ähnliche Methoden zum Hinzufügen und Entfernen von Listenern für ein unterstütztes Event addXXXListener(XXXEvent) removeXXXListener();

Beispiel : Das Interface ActionListener import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class BeispielActionListener implements ActionListener { public void actionPerformed(ActionEvent ae){ //Ausgabe des zum ActionEvent gehörenden ActionEvent System.out.println(“Geklickt: ”+ae.getActionCommand()); } public static void main(String[] args){ JFrame jf = new Jframe(“BeispielActionListener”); //Beschriftung des Jbutton ist gleichzeitig ActionCommand JButton jb = new JButton(“Klick mich”); BeispielActionListener bal = new BeispielActionListener(); jb.addActionListener(bal); jf.setVisible(true); jf.pack(); bei Klick > Geklickt: Klick mich

Events und Listener Typen Es gibt viele weitere, spezialisierte Event- und dazu passende Listener-Typen Mehr dazu unter: http://java.sun.com/docs/books/tutorial/uiswing/events/index.html

Was sind Threads? Erlauben Nebenläufigkeit von unterschiedlichen Programmteilen Quasi-parallel, je nach Systemarchitektur auch echt parallel Ermöglichen bessere Ausnutzung von Prozessorzeit und anderen Resourcen, z.B. Bandbreite einer Internetverbindung

Threads in Java: Die Klasse java.lang.Thread public class ThreadDemo extends Thread{ //Diese Methode stammt aus Runnable, ist aber in Thread //leer implementiert und muss daher überschrieben werden public void run(){ //Zählen in einer Schleife von 0 bis 9 for(int i=0;i<10;i++){ //Ausgabe jeder Zahl auf der Konsole System.out.println("Zahl "+i); } //fertig! System.out.println("Fertig!"); public static void main(String[] args){ //Erzeugen einer neuen Instanz, inklusive Thread ThreadDemo td = new ThreadDemo(); //Thread starten td.start();

Threads in Java: Das Interface java.lang.Runnable public class RunnableDemo implements Runnable{ //Diese Methode stammt aus Runnable und muss //implementiert werden public void run(){ //Zählen in einer Schleife von 0 bis 9 for(int i=0;i<10;i++){ //Ausgabe jeder Zahl auf der Konsole System.out.println("Zahl "+i); } //fertig! System.out.println("Fertig!"); public static void main(String[] args){ //Erzeugen einer neuen Instanz RunnableDemo rd = new RunnableDemo(); //Erzeugen eines Thread, um das Runnable auszuführen Thread t = new Thread(rd); //Thread starten t.start();

Beispiel: Downloadmanager Wir wollen ein Programm zum Download von Dateien schreiben Es sollen mehrere Dateien geladen werden können Eingabe: URLs, die die Dateien auf einem entfernten Rechner addressieren, Zugriff über das http Protokoll Öffnen einer Verbindung pro Datei, herunterladen der Datei auf den lokalen Rechner

Beispiel: Downloadmanager public class DownloadManager{ public DownloadManager(URL[] url) { //Vereinfachte For-Schleife for(URL u:url){//sequentiell-> Ausführung hintereinander download(u); } public File download(URL url) { //Öffne http Verbindung HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //Verbinde mit Server connection.connect(); //öffne url InputStream istream = connection.getInputStream(); //lese von istream und schreibe in datei (ohne Details) return readFile(istream); ...

Beispiel: Downloadmanager Problem 1: Wir wollen mehr als eine Datei gleichzeitig herunterladen können, um unseren Internetanschluß voll auszulasten Problem 2: Download einer Datei dauert eventuell sehr lang, andere sind vielleicht schneller heruntergeladen Lösung: Jede Datei wird von einem eigenen, unabhängigen Thread heruntergeladen!

Beispiel: Downloadmanager

Beispiel: Downloadmanager public class Download implements Runnable { private URL url = null; public Download(URL url) { this.url = url; } public void run() { HttpURLConnection connection = null; try {//Verbindung aufbauen connection = (HttpURLConnection) url.openConnection(); connection.connect(); readFile(connection.getInputStream());//einlesen } catch (IOException e) { e.printStackTrace(); } finally { if (connection != null) {//Verbindunng in jedem Fall schliessen connection.disconnect(); ...

Beispiel: Downloadmanager public class DownloadManager2{ public DownloadManager2(URL[] url) { //Vereinfachte For-Schleife (ab Java 1.5) for(URL u:url){//sequentiell-> Ausführung hintereinander Thread t = new Thread(new Download(u)); t.start();//Methode kehrt sofort zurück -> Ausführung der //anderen Downloads beginnt unmittelbar } public static void main(String[] args) { URL[] url = new URL[args.length];//Vorsicht, evtl. ist args==null for(int i=0;i<args.length;i++) { url[i] = new URL(args[i]); //Download starten DownloadManager2 dm = new DownloadManager2(url);

Speziallfall Swing: Der Event Dispatch Thread Die meisten Swing Objektmethoden sind nicht synchronisiert => Veränderungen durch verschiedene Threads können zu Inkonsistenzen führen Daher: Synchronisierungen von Änderungen über den Event Dispatch Thread => Events werden dadurch in der Reihenfolge Ihres Eintreffens ausgeführt Code auf dem EDT sollte nicht lange brauchen, sonst => Blockieren der GUI!

ActionListener revisited, wie man die GUI blockiert ... public class BeispielActionListener implements ActionListener { public void actionPerformed(ActionEvent ae){ //Ausgabe des zum ActionEvent gehörenden ActionEvent System.out.println(“Geklickt: ”+ae.getActionCommand()); //eintausend Wiederholungen for(int i = 0; i< 1000;i++) { if (SwingUtilities.isEventDispatchThread(){ //Ausführung im EventDispatchThread? System.out.println("Running on EDT!"); } try {//Für 100 Millisekunden schlafen Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); > Geklickt: Klick mich und 1000x > Running on EDT! bei Klick

Spezialfall Swing: Der Event Dispatch Thread //Erweiterung von Download public class Download implements Runnable { //Jlabel stellt u.a. einzeilige Strings dar, nicht editierbar! Jlabel progressLabel = null; ... public Download(URL url, Jlabel progressLabel) { this.url = url; this.progressLabel = progressLabel; } @Override public void run() { HttpURLConnection connection = null; try {//Verbindung aufbauen updateLabel(“Baue Verbindung auf zu “+url.toString()); connection = (HttpURLConnection) url.openConnection(); connection.connect(); updateLabel(“Verbunden”); readFile(connection.getInputStream());//einlesen updateLabel(“Datei geladen!”);

Spezialfall Swing: Der Event Dispatch Thread //Erweiterung von Download public class Download implements Runnable { ... //message ist als final (unveränderlich) deklariert private void updateLabel(final String message) { Runnable r = new Runnable( public void run() { //Nur Setzen der Nachricht auf dem Jlabel, //keine zeitintensiven Aktionen! progressLabel.setText(message); } ); //Führt r demnächst auf dem EventDispatch aus SwingUtilities.invokeLater(r);

Threads: Zusammenfassung Threads sind in Java einfach zu benutzen Für unabhängige Aufgaben in einer GUI: s.h. Beispiel MyWorker im Skript Je unabhängiger ein Programmteil von Interaktion mit anderen ist, desto einfacher ist dessen Auslagerung in einen Thread Mit Threads sind vorhandene Resourcen, z.B. verfügbare Prozessoren eines Rechners besser nutzbar

Threads: Zusammenfassung Offene Probleme: Threads, die sich eine Resource teilen, z.B. die Standardausgabe (Konsole), konkurrieren um den Zugriff darauf => Synchronisierung nötig, sonst nicht vorhersagbares Verhalten Nicht behandelt: Der Lebenszyklus eines Threads Dazu und zu vielem mehr http://java.sun.com/docs/books/tutorial/essential/concurrency/

Lesenswertes ... Java ist auch eine Insel – Kapitel 15 http://www.galileocomputing.de/openbook/javainsel7/ Swing Tutorial http://java.sun.com/docs/books/tutorial/uiswing/