Grafische Benutzeroberflächen in JAVA



Ähnliche Dokumente
Grafische Benutzeroberflächen in JAVA

GUI Programmierung mit JAVA Swing

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

GUI Programmierung in Java

Java I Vorlesung 11 Graphische Oberflächen mit Swing

Einstieg in die Informatik mit Java

Objektorientierte Software-Entwicklung

Objektorientierte Programmierung

Swing Lernen am Code Teil 1

Funktionale und Objekt-Orientierte Programmierkonzepte

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

Kap. 35 Swing: Grundlagen Kap Swing: Hauptfenster

11. GUI-Programmierung mit SWING Überblick

GRAFISCHE BENUTZERSCHNITTSTELLEN

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Grafische Benutzeroberflächen mit Swing

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

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

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

Einführung in die Programmierung für NF. Übung

NTB Druckdatum:

Graphical User Interfaces

Softwaretechnik (Medieninformatik): GUIs mit Swing Überblick

Graphische Benutzungsoberflächen

Tutorial04: Swing: Erstellen eines JFrames mit einem JSplitPane

Übung: Verwendung von Java-Threads

Java: Vererbung. Teil 3: super()

Ist eine Softwarekomponente, die dem Benutzer eines Computers die Interaktion mit der Maschine über grafische Symbole erlaubt

Benutzeroberflächen. Java Teil 4

Dokumentation des Projektes Tic Tac Toe

Grundlagen der Programmierung APPLETS

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

Innere Klassen in Java

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.

Schieberegler und analoge Anzeigen

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

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Institut für Informatik

Programmieren in Java

Einführung in die Programmierung

Swing :Komponenten I (Teil 2)

2A Basistechniken: Weitere Aufgaben

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

Objektorientierte Programmierung

Objektorientierte Softwareentwicklung

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

Java Einführung Abstrakte Klassen und Interfaces

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

Distributed Computing Group

Delegatesund Ereignisse

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

Objektorientierte Programmierung für Anfänger am Beispiel PHP

JAVA Oberflächen mit Swing

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

Programmierkurs Java

Java Lab 2006/12/13 Client

WPF Steuerelemente Listbox, ComboBox, ListView,

...erinnern Sie sich? oopjs4b / kwhbkd4r

Text Formatierung in Excel

Informatik Kurs 12 André Hoffmann. Delphi. Einführung in die Windows- Programmierung

Comic Life 2.x. Fortbildung zum Mediencurriculum

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

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

5.2 Neue Projekte erstellen

Javakurs für Fortgeschrittene

3. GLIEDERUNG. Aufgabe:

WhiteStarUML Tutorial

Mensch-Maschine-Interaktion

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

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

Kapitel 8: Grafische Benutzerschnittstellen

Schritt für Schritt Anleitung zum Erstellen einer Android-App zum Ein- und Ausschalten einer LED

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Grundlagen von Python

Java GUI Entwicklung mit Swing

GUI Programmierung mit javax.swing

Tutorial: Wie kann ich Dokumente verwalten?

Übungen Programmieren 1 Felix Rohrer. Übungen

Ziele. Kapitel 8: Grafische Benutzerschnittstellen. AWT und Swing. Ziele (2)

Einführung in die Java- Programmierung

HTML Programmierung. Aufgaben

EINFACHES HAUSHALT- KASSABUCH

Client-Server-Beziehungen

EchoLink und Windows XP SP2

Klausur zur Einführung in die objektorientierte Programmierung mit Java

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

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

GUI-Programmierung in Java

Programmierung für Mathematik (HS13)

Technische Dokumentation SilentStatistikTool

Programmieren II. Die Klasse JList. Vorlesung 5. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester JList.

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE

Ereignisbehandlung 21

Einführung in GUI-Programmierung. javax.swing

Programmiertechnik GUI Programmierung mit Java Swing

Mediator 9 - Lernprogramm

PCB manuell generieren

Transkript:

Grafische Benutzeroberflächen in JAVA Jan-Philipp Kappmeier Technische Universität Berlin 15. 05. 2012

Inhalt 1 Swing-Einführung Einleitung Ein Fenster erstellen 2 Swing-Komponenten Einfache Komponenten Ereignisse und Listener Container-Komponenten Standarddialoge 3 Threads Einführung Multithreading Umgang mit rechenintensiven Arbeiten in Swing Animation in Swing 4 Java2D Manuelles Zeichnen 2 / 53

Einleitung Grafische Oberflächen in JAVA Java Foundation Classes (JFC) APIs für die Programmierung von grafischen Oberflächen in JAVA Abstract Window Toolkit (AWT) Swing Java2D Veraltet nicht Systemunabhängig Seit Java 1.2 (1998) Einheitliches Aussehen Accessibility Internationalization Drag & Drop 3 / 53

Einleitung Swing Was Swing kann Modular, Objektorientiert, nutzt MVC für Komponenten Plattformunabhängig Aussehen konfigurierbar mit Look-and-Feels einheitliche Designs, standard: Motif Standardsystem-Design möglich. (Unterstützt auf Windows, Linux, MacOS) Standardmäßig werden sehr viele (auch komplexe) Komponenten bereitgestellt Mittlerweile (spätestens ab Java 1.5) schnell 4 / 53

Einleitung Threads und Swing Swing ist nicht Threadsicher JAVA stellt immer den Event Dispatch Thread (EDT) bereit Swing-Komponenten dürfen nur im EDT erstellt werden Auch Zugriff auf Komponenten nur aus dem EDT Rechenintensive Arbeiten dürfen nicht im EDT stattfinden JAVA bietet verschiedene Hilfsklassen für diese Zwecke an 5 / 53

Einleitung Obligatorische Informationsquellen Java ist auch eine Insel (10. Auflage, mit Java 7) http://openbook.galileocomputing.de/javainsel10/ Swing Tutorials und Beispiele von Oracle http://docs.oracle.com/javase/tutorial/uiswing/ Wie immer: die JAVA-API http://docs.oracle.com/javase/6/docs/api/ für das JDK 1.6 bzw. http://docs.oracle.com/javase/7/docs/api/ für Java 7 CoMa-Forum Google ist dein Freund 6 / 53

Ein Fenster erstellen Fenster in Swing Fenster Alle Komponenten in Swing beginnen mit einem J. Fenster sind vom Typ JFrame Als Prameter wird dem Konstruktor der Titel übergeben: JFrame fenster = new JFrame( "Mein Fenstertitel"); Die Methode setvisible kann es anzeigen und auch wieder ausblenden 7 / 53

Ein Fenster erstellen Beispiel: Erstellen eines einfachen Fensters // Create a window for the application JFrame frame = new JFrame( "HelloWorld Swing example" ); // Define what happens if the window closes frame.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); // Add a label with a message JLabel label = new JLabel( "Hello World!" ); // Add the label to the window frame.getcontentpane().add( label ); // Automatically set positions and sizes frame.pack(); // Finally, display the window frame.setvisible( true ); 8 / 53

Ein Fenster erstellen Beispiel: Funktionen für Fenster // Set the size of the window setsize( 640, 480 ); // Place window in the center of the screen Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); setlocation( (d.width - getsize().width) / 2, (d.height - getsize().height) / 2 ); // do not use pack if the window should have a specific si // pack(); 9 / 53

Ein Fenster erstellen Erzeugen des Fensters im Event Dispatch Thread Bisher: Swing-Objekte müssen im EDT erzeugt werden. Aufgaben Auslagern Aufgaben, die Ausgelagert werden sollen, können vom Typ Runnable sein. Dies ist ein Interface. Die Methode run() muss implementiert werden. Sie kann dann von einem Thread aufgerufen werden 10 / 53

Ein Fenster erstellen Erzeugen des Fensters im Event Dispatch Thread forts. Zugriff auf den Event Dispatch Thread JAVA bietet dazu die Hilfsklasse SwingUtilities an invokeandwait führt ein Objekt vom Typ Runnable aus und wartet, bis die Aufgabe erledigt ist. Niemals im Event Dispatch Thread aufrufen! invokelater führt ein Objekt vom Typ Runnable aus und arbeitet direkt weiter. Mit iseventdispatchthread kann festgestellt werden, ob der Code gerade im Event Dispatch Thread ist 11 / 53

Ein Fenster erstellen Beispiel: Erstellen eines einfachen Fensters cont. public static void main( String[] args ) { // Create a new task for the event dispatch thread Runnable createwindowtask = new Runnable() { public void run() { createandshowwindow(); } }; } // Send the job to the event dispatch thread // and continue here SwingUtilities.invokeLater( createwindowtask ); // Will be executed in parallel dosomethingelse(); 12 / 53

Ein Fenster erstellen Systemabhängiges Look and Feel Mehrere Oberflächen-Designs zur Auswahl. Mindestens: System-Typisch und Swing-Standard Seit neueren Java 1.6-Versionen: NIMBUS import javax.swing.uimanager; try { // System look and feel UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); // Nimbus: UIManager.setLookAndFeel( "javax.swing.plaf.nimbus.nimbuslookandfeel" ); } catch( Exception e ) { // Handle error case } 13 / 53

Einfache Komponenten Normale Komponenten und Container Normale Komponenten Ermöglichen Interaktion mit dem Benutzer Benutzerinteraktion läuft über EventListener Viele zeigen Daten über ein Daten-Modell an (MVC) Zum Beispiel: JLabel, JButton, JTextField, JComboBox,... Container Meistens keine direkte Interaktion mit dem Benutzer Können andere Komponenten enthalten und ggf. anordnen Anordnung der Kind-Komponenten über LayoutManager Standardmäßig kann ein JFrame nur eine Komponente anzeigen Zum Beispiel: JPanel, JSplitPane, JTabbedPane,... 14 / 53

Einfache Komponenten Beispiel Komponenten // Create a label, button and checkbox JLabel label = new JLabel( "Ein Informationstext" ); JButton button = new JButton( "Eine Schaltfläche" ); JCheckBox checkbox = new JCheckBox( "Kontrollkästchen" ); // Add the components to the panel panel.add( label ); panel.add( button ); panel.add( checkbox ); // And add the panel to the frame frame.getcontentpane().add( panel ); 15 / 53

Einfache Komponenten Datenmodelle Komponenten mit Modellen Einige Komponenten speichern ihre Daten in einem Modell: JListBox, JComboBox, JTable Das Modell für die Listbox wird durch das Interface ListModel definiert Zu jedem Modell gibt es eine Standardvariante, für Listenfelder z. B. DefaultListModel Default-Modelle können meistens nur Text anzeigen Daten, die in der Komponente angezeigt werden sollen, müssen in das Modell eingefügt werden Dies ist eine Variante des MVC-Modells. Genauer: Observable/Observer 16 / 53

Einfache Komponenten Beispiel Kombinationslistenfeld mit Modell // Create a default model for the combo box DefaultComboBoxModel model = new DefaultComboBoxModel(); // Fill the model with some entries // For general objects tostring() is used for( int i = 1; i < 10; ++i ) model.addelement( "Zeile " + Integer.toString( i ) ); // Create a new combo box with the model JComboBox combobox = new JComboBox( model ); 17 / 53

Einfache Komponenten Einige Standardkomponenten und die zugehörigen Modelle Java-Komponente Modell-Interface Standardimplementation JList ListModel DefaultListModel JComboBox ComboBoxModel DefaultComboBoxModel JTable TableModel DefaultTableModel JTree TreeModel DefaultTreeModel 18 / 53

Ereignisse und Listener Reaktion auf Benutzereingaben Bislang: Erstellen von Steuerelementen (und Platzieren im Fenster). Nun: Reaktion auf Benutzereingaben Senden und Lauschen Alle Oberflächenkomponenten in Swing senden passende Ereignisnachrichten wenn ein Benutzer mit ihnen interagiert z. B. falls eine Schaltfläche gedrückt wird oder ein Listenelement ausgewählt wird Die Nachricht wird an alle Listener geschickt, die dem Sender bekannt sind (die das Interface EventListener implementieren) Wenn man an einer Nachricht interessiert ist, muss man sich beim Sender registrieren 19 / 53

Ereignisse und Listener Reaktion auf Benutzereingaben Beispiel Eine Schaltfläche sendet ein ActionEvent wenn sie gedrückt wird Registrierung eines listeners mit addactionlistener Der Listener ist abstrakt, es muss die Methode actionperformed( ActionEvent e ) implementiert werden die Methode wird aufgerufen wenn der Button gedrückt wird Einfachste Implementation: als anonyme Klasse Aber: wird schnell unübersichtlich. Dann Auslagern in eigene Klassen 20 / 53

Ereignisse und Listener Beispiel Schaltfläche und Listener als anonyme Klasse // Create a label, button and checkbox to the final JButton button = new JButton( "Hallo" ); // Add an action listener to the button button.addactionlistener( new ActionListener() { /** Change button text */ public void actionperformed( ActionEvent e ) { if( button.gettext().equals( "CoMa" ) ) button.settext( "Hallo" ); else button.settext( "CoMa" ); } } ); 21 / 53

Ereignisse und Listener Beispiel Schaltfläche und das Fenster als Listener Die Oberfläche selbst kann auch als Listener fungieren: // Create a class extending JFrame class MyFrame extends JFrame implements ActionListener { Dann kann die Instanz des Fensters an den Listener übergeben werden: // Add an action listener to the button button.addactionlistener( this ); Die Methoden des Listeners sind nun Methoden der Klasse: /** Change button text */ public void actionperformed( ActionEvent e ) { if( button.gettext().equals( "CoMa" ) ) button.settext( "Hallo" ); else button.settext( "CoMa" ); } 22 / 53

Ereignisse und Listener Beispiel Schaltfläche und separate Klasse als Listener Eine eigene Klasse für den Listener: // Create a class for the action listener public class MyListener extends ActionListener { /** Change button text */ public void actionperformed( ActionEvent e ) { System.out.println( "Schaltfläche gedrückt" ); } } Dann kann die Instanz des Fensters an den Listener übergeben werden: // Add an action listener to the button button.addactionlistener( new MyListener() ); Vorteile: Objektorientiert, Trennung von Oberfläche und Listener Gut für komplexen Programmcode geeignet 23 / 53

Ereignisse und Listener Einige Standardkomponenten in Swing Steuerelement Java-Komponente Interessanter Listener Fenster JFrame WindowListener Schaltfläche JButton ActionListener Textfeld JTextField KeyListener Textbereich JTextArea KeyListener Fortschrittsbalken JProgressBar ChangeListener Listenfeld JList ListSelectionListener Kombinationsliste JComboBox ItemListener Tabelle JTable Kontrollkästchen JCheckBox ActionListener Optionsfeld JRadioButton ActionListener Formatiertes Textfeld JEditPane KeyListener Hoch-Runter-Auswahl JSpinner ChangeListener Baum JTree spezielle TreeListener KeyListener, MouseListener, MouseWheelListener und MouseMotionListener für allgemeine Komponenten (JComponent). 24 / 53

Ereignisse und Listener Adapterklassen Listener im Detail Listener sind Interfaces alle Methoden müssen überschrieben werden Für MouseListener sind das 5 Stück! Wenn man am Mausklick interessiert ist, aber Mausbewegungen egal sind, bedeutet das 4 leere Methoden Als Lösung nutze Adapterklassen. Enthalten alle abstrakten Methoden leer vorimplementiert! Einige wichtige Adapterklassen: WindowAdapter, MouseAdapter, KeyAdapter 25 / 53

Container-Komponenten Anordnen von Komponenten in Containern Layouts von Containern Anordnung wird festgelegt von einem LayoutManager Wird mit setlayout( LayoutManager ) gesetzt Der zweite Parameter von.add() spezifiziert die Anordnung in Abhängigkeit vom gewählten LayoutManager Das Standardlayout ist FlowLayout und setzt alle Komponenten nebeneinander. Alle Container können ineinander verschachtelt werden! 26 / 53

Container-Komponenten Das BorderLayout Unterteilt das Fenster in 5 Bereiche Oben, Unten, Links, Rechts und Mitte Steuerelemente werden gestreckt, so dass der komplette Bereich ausgefüllt wird 27 / 53

Container-Komponenten Beispiel BorderLayout // Create a panel containing several components JPanel p = new JPanel(); // Set the layout manager for the panel p.setlayout( new BorderLayout() ); // Add some components to the panel // Each component can have one of 5 positions p.add( new JButton( "North" ), BorderLayout.NORTH ); p.add( new JButton( "South" ), BorderLayout.SOUTH ); p.add( new JButton( "East" ), BorderLayout.EAST ); p.add( new JButton( "West" ), BorderLayout.WEST ); p.add( new JButton( "Center" ), BorderLayout.CENTER ); 28 / 53

Container-Komponenten Das GridBagLayout Komplizierte Variante eines Gitters Teilt den Bereich in ein Gitter ein Elemente können über mehrere Spalten und Zeilen gehen Anordnung über Bedingungen und Gewichte Relativ kompliziert Einfaches Beispiel mit 5 Schaltflächen auf http://java.sun.com/docs/books/tutorial/uiswing/ layout/gridbag.html benötigt etwa 40 Zeilen Code! Das einfachere GridLayout stellt ein Gitter zur Verfügung, in dem alle Komponenten gleiche Breite und Höhe haben und nur eine Zelle belegen können. 29 / 53

Container-Komponenten Das TableLayout Die bessere Gittervariante Beispiel Kann Komponenten ebenfalls auf einem Gitter platzieren Größe der einzelnen Zellen wird durch ein 2-dimensionales Array angegeben Absolute, relative und spezielle Größen möglich: Relativ: Zahlen von 0 bis 1 Absolut: Zahlen größer als 1 Speziell: TableLayout.PREFERRED, TableLayout.FILL Nicht offiziell im Umfang von Swing enthalten, nur als Bibliothek Angabe der Position von Schaltflächen über einen Koordinatenstring:.add( comp, "1,2,6,9") fügt eine Komponente comp hinzu, die den quadratischen Bereich von (1, 2) bis (6, 9) ausfüllt. 30 / 53

Container-Komponenten Beispiel TableLayout // Create the array for the layout double[][] size = { // Columns {10, TableLayout.PREFERRED, 10, TableLayout.FILL, 10}, // Rows {10, 0.12, 10, TableLayout.FILL, 10} }; // Set the layout manager for the panel panel.setlayout( new TableLayout( size ) ); // Add some components to the panel and the panel to the f panel.add( new JButton( "Links" ), "1,1" ); panel.add( new JButton( "Rechts" ), "3,1" ); panel.add( new JButton( "Unten" ), "1,3,3,3" ); frame.getcontentpane().add( panel ); 31 / 53

Container-Komponenten Weitere Layouts CardLayout Mehrere Komponenten aufeinander Nur eine wird angezeigt Wie Kartenstapel, wo nur die oberste Karte sichtbar ist BoxLayout Mehrere Komponenten nebeneinander oder übereinander Komponenten nebeneinander, auch wenn Fenstergröße verändert wird Nur für einfache Fälle geeignet, einfacher als TableLayout 32 / 53

Container-Komponenten Einige weitere Container in Swing JTabbedPane Ein Karteikartensystem mit Reitern JSplitPane Teilt das Fenster in zwei Bereiche mit verschiebbarem Trennelement JScrollPane Zeigt horizontale und vertikale Scrollbalken an Fungiert auch als Container für Elemente in den Ecken JToolBar Eine Symbolleiste Am oberen Rand angedockt oder auch als eigenes Fenster JMenuBar Spezieller Container der Menüelemente enthalten kann Eine Statusleiste (für den unteren Fensterrand) fehlt in Swing. Eine simple Variante kann von uns bereitgestellt werden, wenn ihr eine solche nutzen wollt. 33 / 53

Standarddialoge Schnelle Meldungen // Display an error message JOptionPane.showMessageDialog( // The parent window frame, // The error message "Schiefgelaufen!", // The Title "Fehler", // The symbol for the message JOptionPane.ERROR_MESSAGE ); 34 / 53

Standarddialoge Einen Text eingeben // Display a dialog to input a text String s = (String)JOptionPane.showInputDialog( // The parent frame frame, // The text "The answer to life, the universe and everything:", // The title "Question", // The symbol JOptionPane.PLAIN_MESSAGE ); 35 / 53

Standarddialoge Schnelle Entscheidungen // Custom text for the buttons Object[] options = {"Rote Pille", "Blaue Pille"}; // Get the index of the chosen button int n = JOptionPane.showOptionDialog( // The parent window frame, // Text in the dialog "Wähle eine Pille...", // Message title "Die wichtigste Entscheidung deines Lebens", // Style for the dialog: use buttons JOptionPane.YES_NO_CANCEL_OPTION, // Symbol and additional icon JOptionPane.QUESTION_MESSAGE, null, // The list of options and default option options, options[1] ); 36 / 53

Standarddialoge Weitere Dialoge: Spezialisierte Dialoge JColorChooser Zeigt ein Dialog zur Auswahl einer Farbe an JFileChooser Zeigt einen Dialog zum Öffnen/Speichern an 37 / 53

Standarddialoge Beispiel: Datei öffnen FileFilter ff = new FileFilter() { @Override public boolean accept( File f ) { return f.isdirectory() f.getname().tolowercase().endswith( ".txt" ); } @Override public String getdescription() { return "Text"; } }; filechooser = new JFileChooser( "./" ); filechooser.setfilefilter( ff ); if( filechooser.showopendialog( parent ) == JFileChooser.APPROVE_OPTION ) load( filechooser.getselectedfile() ); 38 / 53

Einführung Multithreading Was sind Threads? Threads erlauben parallele Ausführung von Programmen wird immer wichtiger durch komplexere Aufgabenstellungen und große Verfügbarkeit von Mehrkernprozessoren problematisch: Beziehungen zwischen verschiedenen Threads die aufeinander angewiesen sind und gleiche Ressourcen benutzen! Deadlocks können auftreten Deadlock Gemeinsame Ressource R, z. B. Variable Thread A belegt R und wartet auf Thread B Thread B wartet auf Freigabe von R Vorsichtig programmieren! 39 / 53

Einführung Multithreading Threads in Java Benutzung von Threads abstrakte Klasse Thread Methode run muss implementiert werden. Hier wird die Arbeit erledigt Thread wird gestartet durch start() Gemeinsame Ressourcen Java Codewort synchronized möglich für Funktionen oder Codeblöcke Code im synchronized-bereich wird ausgeführt, ohne dass andere Threads Zugriff auf die benutzten Variablen erhalten 40 / 53

public static void main( String args[] ) { ThreadCount c1 = new ThreadCount( "1", 200 ); c1.start(); } } 41 / 53 Einführung Multithreading Beispiel: Zähl-Thread public class ThreadCount extends Thread { private int c; public ThreadCount( String name, int c ) { super( name ); this.c = c; } @Override public void run() { for( int i = 0; i < c; ++i ) System.out.println( "Thread " + getname() + " :" + i }

t.start(); t2.start(); // Starte Threads t.join(); t2.join(); // Warte auf ende System.out.println( "Minimum: " + min ); } 42 / 53 Einführung Multithreading Beispiel: Array summieren public class ThreadMinimum extends Thread { static int sum; // Summe static int[] numbers; // Zufallszahlen public void run() { for( int i = start; i <= end; ++i ) addnumber( numbers[i] ); } public static synchronized void addnumber( int i ) { sum += i; } public static void main( String args[] ) throws Interrup ThreadMinimum t = new ThreadMinimum( 0, n/2 ); ThreadMinimum t2 = new ThreadMinimum( n/2+1, n-1 );

Umgang mit rechenintensiven Arbeiten in Swing Arbeitsweise von Swing Der Ereignis-Thread Jede Interaktion sendet ein Ereignis (Event) an den EDT Im EDT läuft eine Schleife die Nacheinander alle Ereignisse bearbeitet Wenn notwendig, werden passende EventListener aufgerufen Lange Berechnungen in Ereignisbehandlungsmethoden lassen die Oberfläche einfrieren Im EDT müssen alle Methoden schnell zurückkehren Außerdem: deutlicher Geschwindigkeitszuwachs 43 / 53

Umgang mit rechenintensiven Arbeiten in Swing Arbeit auslagern in Threads Generelle Funktionsweise Java stellt die abstrakte Klasse SwingWorker<T,V> zur Verfügung Kann ein Ergebnis vom Typ T berechnen Kann zwischendurch Fortschritt vom Typ V ausgeben Aufgaben werden in der abstrakten Methode public T doinbackground() ausgeführt Ausführung in einem neuen Thread mit execute() done() wird (im EDT) aufgerufen, wenn die Ausführung beendet ist 44 / 53

Umgang mit rechenintensiven Arbeiten in Swing Arbeit auslagern in Threads forts. Anzeigen von Fortschritt Beispiel Fortschritt der Berechnung wird mit publish( V ) abgesendet dies passiert im neu gestarteten Thread process( List<V> chunks ) erhält eine Liste von evtl. mehreren Fortschrittsnachrichten (im EDT) es kann auf Swing-Komponenten zugegriffen werden Annahmen: Berechne ein Zwischenergbnis in 1 Millisekunde und sende Fortschritt mit publish Aktualisieren der Oberfläche dauert 0, 1 Sekunden Die Oberfläche kann nur jeden 100. Status anzeigen. Deshalb: Nachrichten werden gesammelt als Liste an process gegeben 45 / 53

Umgang mit rechenintensiven Arbeiten in Swing Beispiel SwingWorker /** A class computing a long with status text */ class Worker extends SwingWorker<Long, String> { /** Search for the next prime */ public Long doinbackground() { findnextmersenneprime( 13466917 ); } /** Yipeeh, we are done. */ protected void done() { label.settext( "Gefunden: " + get() ); } } /** Give out some status text. */ protected void process( List<String> chunks ) { // Set the last process message as status text label.settext( chunks.get( chunks.size()-1 ) ); } 46 / 53

Animation in Swing Animation Klasse Timer führt ein Ereignis in definierten Intervallen aus ruft ActionListener auf läuft in eigenem Thread aufgerufener ActionListener im EDT erlaubt Animation Intervallangabe in Millisekunden 47 / 53

Animation in Swing Beispiel Timer // Set up a timer that is executed once a second Timer timer = new Timer( 1000, new ActionListener() { @Override public void actionperformed( ActionEvent e ) { // Just repaint the user interface repaint(); } }); // Start the timer timer.start(); 48 / 53

Manuelles Zeichnen Einleitung Grundlagen Zeichnen Oft gibt es kein spezielles Steuerelement für eine Aufgabe Erzeugen neuer Steuerelemente die von JComponent erben Zeichnen der Komponente mit paint( Graphics ) Java2D hat einen sehr großen Funktionsumfang! Überlegen, wie man das Ziel erreicht Koordinaten müssen berechnet werden: im Wesentlichen zweidimensionale Vektormathematik Sinnvoll alles Prozentual zu machen. Beispiel: Quadratgröße in Dem Carlos seine Flucht 49 / 53

Manuelles Zeichnen Beispiel Java2D Java2D initialisieren public void paint( Graphics g ) { super.paint( g ); // Set up the java2d graphics object Graphics2D g2d = (Graphics2D)g; // Set quality g2d.setrenderinghint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); } 50 / 53

Manuelles Zeichnen Beispiel Java2D (2) Zeichenoptionen setzen // Set a drawing color. Here red g2d.setcolor( Color.red ); // Set a stroke type. Here: thick lines g2d.setstroke( new BasicStroke( 5 ) ); // Set a font by name g2d.setfont( new Font( "Comic Sans MS", Font.BOLD, 20 ) ); // or by type g2d.setfont( new Font( Font.SERIF, Font.PLAIN, 14 ); // or derive new font from the current font g2d.setfont( g2d.getfont().derivefont( 20f ) ); 51 / 53

Manuelles Zeichnen Beispiel Java2D (3) Formen Zeichnen // Draw a line, from start point to end point g2d.drawline( 0, 0, getwidth(), getheight() ); // Draw a rect between upper left and lower right g2d.drawrect( left, top, right, bottom ); // Draw a text starting in a point g2d.drawstring( "Text", startx, starty ); // Draw ellipse. Start us upper left of // the bounding rectangle g2d.drawarc( x, y, width, height, 0, 360 ); 52 / 53

Manuelles Zeichnen Beispiel Java2D (4) Ein Bild laden Viele Möglichkeiten. Komfortabel: die ImageIO-Klasse // Try to load an image. IOException may be thrown BufferedImage image; try { image = ImageIO.read( new File( "image.png" ) ); } catch( IOException ex ) { // Handle exception } // Draw an image from top left with width and height g2d.drawimage( image, topx, topy, width, height, this ); 53 / 53