Grafiska användargränssnitt i Java

Relevanta dokument
Grafiska användargränssnitt i Java

Grafiska användargränssnitt i Java

Grafiska användargränssnitt i Java

Grafiska användargränssnitt i Java

Java-concept och Swing. Swing low, sweet chariot

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. LayoutManagers. Exempel på några av komponenterna

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

Support Manual HoistLocatel Electronic Locks

2I1049 Föreläsning 8. Grafiska gränssnitt i Java. AWT-komponenter. Grafiska gränssnitt, Java interface och händelsehantering

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

GUI-programmering. Gustav Taxén Martin Berglund DH2640 Grafik och Interaktionsprogrammering VT 2008

Projekt 2 XL. Observer-mönstret

Make a speech. How to make the perfect speech. söndag 6 oktober 13

Fönstersystem. Objektorientering och händelsebaserad programmering. Applikation. Interaktionstoolkit. Händelsehanterare och grafiktoolkit

Lektion Händelsehanterare

MVC-mönstret. model-view-control i Swing

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

Efterhand fick vi ett system som vi tyckte var väl anpassat. Vi renskrev kladden (nedan) och började programmera menyerna.

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 18

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Webbregistrering pa kurs och termin

Mer om grafiska komponenter. Händelsestyrda program

Malmö högskola 2007/2008 Teknik och samhälle

12.6 Heat equation, Wave equation

Tentamen FYTA11 Javaprogrammering

How to format the different elements of a page in the CMS :

Modellsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Laboration 15 Grafiskt användargränssnitt

Webbreg öppen: 26/ /

Preschool Kindergarten

Quick Start Guide Snabbguide

Problem som kan uppkomma vid registrering av ansökan

LiTHehack? Här? lithehack se koma Tisdagar och torsdagar

Lösningsförslag till tentamen

Vässa kraven och förbättra samarbetet med hjälp av Behaviour Driven Development Anna Fallqvist Eriksson

Händelsestyrda program

Föreläsning 8. Designmönster

Grafiska användargränsnitt i Java. Föreläsning 7 Innehåll. Använda klasspaketet Swing. Klasspaket i Java. Grafiska användargränsnitt i Java

Objektorienterad programmering med Java Swing. Programexempel. Swing och AWT AWT. = Abstract windowing toolkit

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås


Omentamen FYTA11 Javaprogrammering

FÖRBERED UNDERLAG FÖR BEDÖMNING SÅ HÄR

Recitation 4. 2-D arrays. Exceptions

OOP Objekt-orienterad programmering

Annonsformat desktop. Startsida / områdesstartsidor. Artikel/nyhets-sidor. 1. Toppbanner, format 1050x180 pxl. Format 1060x180 px + 250x240 pxl.

Frames, menyer och GUI-program

27. GUI Programming. Java. Summer 2008 Instructor: Dr. Masoud Yaghini

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Föreläsning 3: Händelsestyrda program och användargränssnitt

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Boiler with heatpump / Värmepumpsberedare

Malmö högskola 2007/2008 Teknik och samhälle

6 th Grade English October 6-10, 2014

ITK:P1 Lektion 4. Lektion 4. Lektion 4. Att implementera en spelidé i Java. DSV Peter Mozelius

Beijer Electronics AB 2000, MA00336A,

Objektorienterad Programmering DAT043. Föreläsning 5 29/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Arv och Grafiska Användargränssnitt

Grafiska komponenter.

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Adding active and blended learning to an introductory mechanics course

GUI /ll tusen. GUI /ll tusen. Java/Swing. Top Level Containers. General Purpose Containers. GrIP-vt2010-GUI-programmering Cristian Bogdan

Observer Pattern och MVC. Objekt-orienterad programmering och design Alex Gerdes, 2016

Tentamen FYTA11 Javaprogrammering

Inlupp1 - kommentarer. Uppgift 2. Uppgift 2

Isolda Purchase - EDI

BOENDEFORMENS BETYDELSE FÖR ASYLSÖKANDES INTEGRATION Lina Sandström

1. Unpack content of zip-file to temporary folder and double click Setup

Installation av F13 Bråvalla

Lösenordsportalen Hosted by UNIT4 For instructions in English, see further down in this document

Objektorienterad Programmering DAT043. Föreläsning 6 30/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Kursutvärderare: IT-kansliet/Christina Waller. General opinions: 1. What is your general feeling about the course? Antal svar: 17 Medelvärde: 2.

OOP Objekt-orienterad programmering

Health café. Self help groups. Learning café. Focus on support to people with chronic diseases and their families

1 Grafiska komponenter

Information technology Open Document Format for Office Applications (OpenDocument) v1.0 (ISO/IEC 26300:2006, IDT) SWEDISH STANDARDS INSTITUTE

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Travel General. General - Essentials. General - Conversation. Asking for help. Asking if a person speaks English

Fönsterhantering, grafik

Förskola i Bromma- Examensarbete. Henrik Westling. Supervisor. Examiner

LULEÅ TEKNISKA UNIVERSITET

Kvalitetsarbete I Landstinget i Kalmar län. 24 oktober 2007 Eva Arvidsson

Workplan Food. Spring term 2016 Year 7. Name:

Översättning av galleriet. Hjälp till den som vill...

Support for Artist Residencies

Read Texterna består av enkla dialoger mellan två personer A och B. Pedagogen bör presentera texten så att uttalet finns med under bearbetningen.

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

EXPERT SURVEY OF THE NEWS MEDIA

Transkript:

jonas.kvarnstrom@liu.se 2015 Grafiska användargränssnitt i Java

Terminologi 2 Komponenter: Fönster, knappar, menyer, färgväljare och andra grafiska element som syns på skärmen (components) Behållare: De komponenter som innehåller andra komponenter till exempel fönster (containers) SwingSet3: finns på nätet

Java Foundation Classes Java Foundation Classes (JFC) 3 AWT: Abstract Window Toolkit Swing Java 2D Koppling till OS Layout Händelsehantering Enkla komponenter Uppdaterade och mer avancerade GUIkomponenter 2D-grafik (linjer, rektanglar, kurvor, färger, mönster, ) Komponenter: Frame, Button, List, TextField, Använd inte föråldrade! Komponenter: JFrame, JButton, JList, JTextField, Använd dessa!

Steg 1 (idag): Att använda färdiga komponenter: Knappar, menyer, Layout Händelsehantering någon tryckte en knapp" Steg 2 (nästa gång): Att rita på skärmen Att skapa egna komponenter

Genomgående exempel Mål: En väldigt enkel ordbehandlare (texteditor) 6

Att öppna ett fönster 8 Ett vanligt fönster: JFrame public class WordProcessor { private JFrame frame; public WordProcessor() { this.frame = new JFrame("Word Processor 1.0"); frame.setsize(640, 300); frame.setvisible(true); public static void main(string[] args) { new WordProcessor(); Ta reda på skärmens storlek: frame.gettoolkit().getscreensize() http://docs.oracle.com/javase/tutorial/ uiswing/components/frame.html Ordbehandlaren behöver komma ihåg sitt fönster Sätt fönsterstorleken, se till att fönstret visas på skärmen Skapa ett objekt, glöm bort det, och sedan är vi klara? Så länge det finns ett öppet fönster, avslutas inte Java! Vi kan fortfarande använda fönstret genom GUI-händelser (events)

Behållare 1: JFrame 10 En JFrame är en behållare (container) http://docs.oracle.com/javase/tutorial/ uiswing/components/frame.html Komponent som kan innehålla andra komponenter Kan även innehålla andra behållare Fönstertitel Menyrad Kan läggas till vid behov Innehåll: Content pane Hela fönstrets innehåll. utom titelrad / menyrad

Behållare 2: Innehållshierarki Skapar en hierarki av innehåll Varje behållare har en lista med barn 11 Fönster Menyrad ContentPane Meny: File Meny: Edit Meny: Help Knapp1 Knapp2 Textfält Statusrad Val1 Val2 Val3 Har inget att göra med arvshierarkin!

Knappar i Java 12 http://docs.oracle.com/javase/tutorial/ uiswing/components/button.html http://docs.oracle.com/javase/tutorial/ uiswing/components/buttongroup.html Stödklasser Grunden för Swing-komponenter Gemensam implementation: Knappar Har två lägen, av/på Radioknappar: Bara en aktiv åt gången i varje ButtonGroup Standardknapp Checkbox, av/på

Textkomponenter 13 http://docs.oracle.com/javase/tutorial/ uiswing/components/text.html Editera text med flera stilar: HTML, Abstrakt, gemensam funktionalitet En enda rad text Textarea med flera rader Speciell formattering för datum, valuta, Lösenord syns inte när de skrivs in

Ordbehandlare med komponenter 14 För att lägga till komponenter: public WordProcessor() { this.frame = new JFrame("Word Processor 1.0"); http://docs.oracle.com/javase/tutorial/ uiswing/components/label.html frame.add(new JButton("B")); frame.add(new JButton("I")); frame.add(new JButton( U )); frame.add(new JButton( Left")); frame.add(new JButton( Center")); frame.add(new JButton( Right")); Lägger till flera komponenter till behållaren fönstret Inget syns på skärmen än! frame.add(new JTextPane()); frame.add(new JLabel("Status: OK")); // Visar text, kan inte editeras frame.pack(); frame.setvisible(true); NU är det dags att visa fönstret och dess innehåll

Resultat 15 Resultat: Rätt komponenter Fel layout Liten textarea JFrame Content Pane JButton JButton JButton JButton JButton JTe xtp ane JLabel

Önskad layout Önskad layout (positioner och storlek): 17 JButton JButton JButton JButton JTextPane JButton JFrame Content Pane JLabel

Layout 1: Absoluta koordinater? 18 Hur ska behållarens komponenter få rätt position och storlek? Enklast: Absoluta koordinater component.setsize(int width, int height); component.setlocation(int x, int y); // Relativt behållarens övre vänstra hörn Fördelar / nackdelar: (+) Enkelt att förstå (+) Enkelt att skriva GUI-designer ( ) Inget stöd för att ändra storlek (Gammaldags Windows-dialoger har alltid en fast storlek ) ( ) Hur hanterar man större text? ( ) Hur hanterar man översättningar till andra språk, där ord kan ta mer plats?

Layout 2: Önskad storlek 19 Preferred Size http://docs.oracle.com/javase/tutorial/ uiswing/layout/index.html Komponenter kan tala om sin önskade storlek (preferred size) JButton: Storlek på texten i inställd fontstorlek + lite marginaler Ingen text inskriven preferred size är minimal! Varje behållare har en layouthanterare (layout manager) Frågar subkomponenter hur stora de vill vara Applicerar layoutregler (här: "Allt i en rad") Summerar, beräknar behållarens önskade storlek

Layout 3: Innehållshierarkin 20 Anropa pack() i ett fönster (frame) Så frågar den sin layouthanterare hur mycket plats den behöver använd den storleken! Fönster Menyrad ContentPane Meny: File Meny: Edit Meny: Help Knapp1 Knapp2 Textfält Statusrad Val1 Val2 Val3

Layout 4: Annan storlek än önskad 21 När en komponent får större storlek än den begärda: Layouthanteraren har regler för hur utrymmet ska användas Extra utrymme på höjden: Ska användas till textarean Extra utrymme på bredden: Menyrad: Extra plats mellan Edit och Help Knapprad: Allt vänsterjusterat Textfält, statusrad: Använder hela utrymmet Just nu:

Layout 5: Annan storlek än önskad 22 När en komponent får mindre storlek än den begärda: Layouthanteraren har regler för hur komponenter placeras, (krymps) Just nu:

Layouthanterare 1: Inbyggda Flera enkla layouthanterare är inbyggda 23 Save changes before exiting? Yes No Cancel Hur kan man skapa en mer komplex layout med dessa?

Layouthanterare 2: Hierarkisk layout 24 Använd hierarkin! Lägg till en panel så att alla knappar är i en egen grupp JPanel JMenu JButton JButton JButton JButton JTextPane JMenu JMenu JFrame JMenuBar Content Pane JButton JPanel JLabel Fönster Menyrad ContentPane Meny1 Meny2 Panel Textfält Statusrad Val1 Val2 Val3 Knapp1 Knapp2

Layouthanterare 3: MigLayout MigLayout rekommenderas starkt! Baseras på flexibelt rutnät, modern, extremt flexibel this.setlayout(new MigLayout()); this.add(firstnamelabel); this.add(firstnametextfield); this.add(lastnamelabel, this.add(lastnametextfield, this.add(addresslabel); this.add(addresstextfield, "gap unrelated"); "wrap"); "span 3, grow"); Layoutparametrar för varje komponent 25 Default: Använder preferred size; fortsätter på samma rad; lägger till ett mellanrum som passar relaterade komponenter Mellanrum för två orelaterade komponenter Ny rad efter den här komponentent Spänn över 3 kolumner, låt textfältet växa större än sin önskade storlek http://www.miglayout.com/quickstart.pdf http://www.migcalendar.com/miglayout/mavensite/docs/cheatsheet.html

Ordbehandlaren 1: Ett skelett Kodskelett: public class WordProcessor { private JTextPane text; // References to some components private JLabel status; // that we will have to access at various times private JFrame frame; 26 public WordProcessor() { this.frame = new JFrame("Word Processor 1.0"); creategui(); // Adds components to the frame createmenus(); // Adds menus frame.pack(); // Adapt window size frame.setvisible(true); // Show the window! public static void main(string[] args) { new WordProcessor();

Ordbehandlaren 2: Skapa knappar Knappar ligger i sin egen panel Inte ett krav med MigLayout! Men låter oss ta bort och lägga till knappar utan att påverka resten: Huvudfönstrets layouthanterare ser alltid en panel private JPanel createbuttonpanel() { final JPanel buttons = new JPanel(); buttons.setlayout(new MigLayout()); 27 buttons.add(new JButton("B")); buttons.add(new JButton("I")); buttons.add(new JButton("U")); buttons.add(new JButton("Left"), gapleft 10pt ); buttons.add(new JButton("Center")); buttons.add(new JButton("Right")); buttons.add(new JButton("Print"), gapleft 10pt ); return buttons; Separation 10 punkters marginal till vänster om komponenten

Ordbehandlaren 3: Sätta layouthanterare 28 private void creategui() { frame.setlayout(new MigLayout(, [grow,fill], []0[grow,fill]0[] )); Layoutparametrar Inget här Kolumnparametrar Varje kolumn anges i [] Kolumnen kan växa (grow), och ska alltid fylla (fill) tillgängligt utrymme Vårt mål Radparametrar Första raden: [] (default) Mellanrum: 0 pixel Andra raden: Grow, fill Mellanrum: 0 pixel Tredje raden: [] (default)

Ordbehandlaren 4: Ramar 29 Alla komponenter kan ha en ram, som implementerar gränssnittet Border. Använd BorderFactory för vanliga ramtyper. private void creategui() { frame.setlayout(new MigLayout( )); this.text = new JTextPane(); this.status = new JLabel("Status: OK"); text.setborder(borderfactory.createemptyborder(4,4,4,4)); EmptyBorder = tomt utrymme (marginaler) status.setborder(borderfactory.createcompoundborder( BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(2,2,2,2) )); CompoundBorder sätter ihop ramar: Ytterst en etsad ram Innerst en marginal http://docs.oracle.com/javase/tutorial/ uiswing/components/border.html

Ordbehandlaren 5: Scrollning 30 Textfältet måste kunna scrollas I vissa system: "Inbyggt" i textfältet I Java: Lägg komponenten i en JScrollPane Samma hantering av scrollning för alla komponenter private void creategui() { frame.add(createbuttonpanel(), wrap ); frame.add(new JScrollPane(text), wrap ); frame.add(status, wrap ); http://docs.oracle.com/javase/tutorial/ uiswing/components/scrollpane.html Fönster Menyrad ContentPane Meny1 Meny2 Panel JScrollPane Statusrad Val1 Val2 Val3 Knapp1 Knapp2 Textfält

Att skapa menyer 32 private void createmenus() { final JMenu file = new JMenu("File"); file.add(new JMenuItem("Open", 'O')); file.add(new JMenuItem("Save As", 'A')); file.addseparator(); file.add(new JMenuItem("Print")); final JMenu edit = new JMenu("Edit"); edit.add(new JMenuItem("Cut")); edit.add(new JMenuItem("Copy")); edit.add(new JMenuItem("Paste")); // Tangentbordsstyrning // Separator final JMenu help = new JMenu("Help"); help.add(new JMenuItem("About WordProcessor 1.0")); final JMenuBar bar = new JMenuBar(); bar.add(file); bar.add(edit); bar.add(box.createhorizontalglue()); bar.add(help); frame.setjmenubar(bar); http://docs.oracle.com/javase/tutorial/ uiswing/components/menus.html, separator.html Separering Skapar en osynlig komponent, 0 pixel hög, godtyckligt bred

TDDC69 2011-2013: Allt på engelska Använd tid för kursutveckling på bästa sätt TDDD78 2014-2015: Inledande fö. på svenska Nästan helt omskrivet, många fundamentala begrepp TDDD78 2014-2015: Resten på engelska Många justeringar, huvudstrukturen behålls

Event Handling Principles How do we know if a button was pushed? TDDD73: Wait for a click Must know when to check Must handle everything ourselves coordinates, 35

Event Handling Principles (2) 36 In some GUI systems: Tell the system what it should do when the button is clicked Go on with your own task When the button is pushed, another thread handles this asynchronously (Almost) as if: You tell someone else: "If the button is pressed, do this" You keep doing whatever you want to do next Your assistant starts looking for input Sees a button was pressed, does what you asked

Event Handling Principles (3) 37 How to represent what happens and what to do about it? As event objects [händelseobjekt] // Standard Java class public class MouseEvent extends InputEvent { int x; // Coordinates int y; int clickcount; // How many times did they click? int button; // With which mouse button? Button clicked Our "assistant" creates a new MouseEvent

Event Handling Principles (4) 38 How to represent what happens and what to do about it? Could we tell the component which function to call? // Would work in some languages function printmessage() { print "Hey! Someone clicked me!" button.whenclicked(printmessage); Java is object-oriented, has no functions outside classes Java 8 has new magic syntax that lets us do something similar To see what really happens, and to link this to interesting design patterns, we will avoid this syntax for now!

Event Handling Principles (5) 39 How to represent what happens and what to do about it? We'll give the button an object whose methods it can call! // Standard Java interface public interface MouseListener extends EventListener { public void mouseclicked(mouseevent e); public void mousepressed(mouseevent e); Java is manifestly typed, must define a type for the object // Our own class public class MyListener implements MouseListener { public void mouseclicked(mouseevent e) { System.out.println("Hey! Someone clicked me!"); We create a class implementing MouseListener We give our "assistant" a MyListener object whose methods it can call when something happens

Event Handling Principles (6) Every component has a list of Listeners // (This is a simplification ) public class Component { private List<MouseListener> mouselisteners; public void addmouselistener(mouselistener ml) { mouselisteners.add(ml); We can add our own listener to the list // Our own class public class MyGUI { public void creategui() { MouseListener ml = new MyListener(); thebutton.addmouselistener(ml); 40

Events 1: Introduction When a mouse button has been pressed: AWT receives raw keyboard/mouse input from the OS In a background event dispatch thread (your "assistant") Generates low-level event objects: MouseEvent, KeyEvent 41 public class MouseEvent extends InputEvent { int x; // Coordinates int y; int clickcount; // How many times did they click? int button; // With which mouse button?

Events 2: Introduction When a button has been pressed: 42 AWT receives raw keyboard/mouse input from the OS In a background event dispatch thread (your "assistant") Generates low-level event objects: MouseEvent, KeyEvent Asks the relevant component to process the event Mouse click sent to component that was clicked // AWT finds out which component is responsible MouseEvent event = ; Component comp = findoutwhowasclicked(); // AWT asks the component to take care of the event comp.processevent(event);

Events 3: Introduction When a button has been pressed: 43 Asks the relevant component to process the event Mouse click sent to component that was clicked Event processing notifies (calls a method in) every listener Including our registered MyListener public class Component { protected void processmouseevent(mouseevent event) { for (MouseListener listener: MouseListeners) { if (event.getid() == MouseEvent.MOUSE_PRESSED) listener.mousepressed(e); One event at a time! If your listener takes a long time, the UI will freeze. If so, let the listener start a thread!

Events 4: Design Pattern Uses a design pattern called Observer! Components are observable, can tell others when something happens Listeners are observers, observing specific event types 44

WP Events 1: Top-Level Class 45 How are listeners used? public class WordProcessor { private JTextPane text; public JPanel createbuttonpanel() { final JPanel buttons = new JPanel(); final JButton bold = new JButton("B"); buttons.setlayout( ); buttons.add(bold); bold.addactionlistener(new BoldListener(text)); public class BoldListener implements ActionListener { private final JTextPane pane; public BoldListener(JTextPane pane) {this.pane = pane; public void actionperformed(actionevent event) { // Make the selected text bold Called by the event system in the event dispatch thread when Bold is pressed Create local variables for the buttons, so you can refer to them later! A lot of trivial code around the real work

WP Events 2: Inner Class 46 Alternative: Inner Class public class WordProcessor { private JTextPane text; public JPanel createbuttonpanel() { final JPanel buttons = new JPanel(); final JButton bold = new JButton("B"); buttons.setlayout( ); buttons.add(bold); class BoldListener implements ActionListener { public void actionperformed(actionevent event) { foo(text.gettext()); // Make the text bold bold.addactionlistener(new BoldListener()); Define a class inside another even inside a method! Gives access to fields of the enclosing class, final local variables of the method We still need a name

WP Events 3: Anonymous 47 Alternative: Anonymous Inner Class public class WordProcessor { private JTextPane text; public JPanel createbuttonpanel() { final JPanel buttons = new JPanel(); final JButton bold = new JButton("B"); buttons.setlayout( ); buttons.add(bold); ActionListener al = new ActionListener() { public void actionperformed(actionevent event) { foo(text.gettext()); // Make the text bold ; bold.addactionlistener(al); Special syntactic sugar! 1) Declares an unnamed class implementing ActionListener 2) Gives it an implementation for actionperformed() 3) Creates a new object of this unnamed class

WP Events 4: One Listener per Button 48 First alternative: One listener per button bold.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println("Bold"); ); italics.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println("Italics"); ); //... and so on... You know where the event came from the bold button A little bit of overhead from defining many classes

WP Events 5: A Shared Listener Class 49 Second alternative: A combined listener class final ActionListener al = new ActionListener() { public void actionperformed(actionevent e) { if (e.getsource() == bold) { System.out.println("Bold"); else if (e.getsource() == italics) { System.out.println("Italics"); ; bold.addactionlistener(al); italics.addactionlistener(al); //... and so on... Since many components share listeners, you must check the source of each event return buttons;

Actions 50 Alternative for actions that can be triggered from many places: Use Action (interface) and AbstractAction (helper class)! Action boldaction = new AbstractAction("Action Name") { // Instance initializer to set some (optional) values { putvalue(short_description, "Tool Tip Text"); ; putvalue(small_icon, new ImageIcon("icon.gif")); putvalue(mnemonic_key, new Integer(KeyEvent.VK_A)); //underlined putvalue(accelerator_key, KeyStroke.getKeyStroke("control F2")); public void actionperformed(actionevent evt) { // Perform action Many components can be constructed from an action object panel.add(new JButton(boldAction)); editmenu.add(boldaction); toolbar.add(boldaction); http://docs.oracle.com/javase/tutorial/ uiswing/misc/action.html

Menu Events Event handling for menus: No difference in principle final JMenuItem open = new JMenuItem("Open"); filemenu.add(open); open.addactionlistener( ); 51

Event Listener Overview 52 Some of the most important listeners: ActionListener Button pushed, menu item selected, AdjustmentListener ItemListener MouseListener MouseMotionListener KeyListener Slider or scroll bar adjusted Items selected in list Mouse button pushed/released, Mouse pointer moved Key pressed, typed, released Sent to the component that has keyboard focus If not processed, passed on to its container, etc. To react directly to keyboard input, see: http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

A simpler replacement for key listeners

Key Bindings: The Concept KeyStroke: A combination of keys (X, Ctrl-Shift-Z, ) 54 Each component's InputMap maps keystrokes to action names The name of an action (a String) A component's ActionMap maps keystrokes to action names Action: Contains code to be performed when the keys are pressed

Key Bindings: ActionMap 55 Alternative to KeyListener: Key Bindings class MyGameComponent extends JComponent { class MoveLeftAction extends AbstractAction { public void actionperformed(actionevent e) { do something private void addbindings() { Action movetotheleft = new MoveLeftAction(); getactionmap().put( moveleft, movetotheleft); Define a class implementing Action (in one of many ways ) Create an Action object (can be used in menus or other places as well) Define which Action is called for the action name moveleft

Key Bindings: InputMap 56 Alternative to KeyListener: Key Bindings class MyGameComponent extends JComponent { Works if keyboard focus private void addbindings1() { is in THIS component InputMap map1 = getinputmap(jcomponent.when_focused); map1.put(keystroke.getkeystroke( LEFT ), moveleft ); Check the KeyStroke Javadoc for examples https://docs.oracle.com/javase/8/docs/api/javax/swing/keystroke.html An action name

Key Bindings: InputMap 57 Alternative to KeyListener: Key Bindings class MyGameComponent extends JComponent { private void addbindings2() { Works if keyboard focus InputMap map2 = getinputmap( is here or in a subcomponent JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); map2.put(keystroke.getkeystroke( released RIGHT, stopright )); Works if keyboard focus InputMap map3 = getinputmap( is in the same window JComponent.WHEN_IN_FOCUSED_WINDOW); map3.put(keystroke.getkeystroke( Ctrl F2, quit )); Fönster Menyrad ContentPane Meny1 Meny2 Panel JScrollPane Statusrad Val1 Val2 Val3 Knapp1 Knapp2 Textfält

JOptionPane Standard dialog windows: JOptionPane 59 Simple question: String input = JOptionPane.showInputDialog("Please input a value"); Can specify a frame that owns the dialog Blocks input to this frame JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green."); Can give additional options JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.", "Inane warning", JOptionPane.WARNING_MESSAGE);

JOptionPane (2) Complex dialog windows // Custom button text Object[] options = { "Yes, please", "No, thanks", "No eggs, no ham!" ; int optionchosen = JOptionPane.showOptionDialog( frameparent, // A window that owns the dialog "Would you like some green eggs to go with that ham?", "A Silly Question", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, // Custom text options[2] // Default choice ) 60 http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

File and Color Dialogs 61 Additional dialog windows: File dialogs http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html Color selection dialogs http://docs.oracle.com/javase/tutorial/uiswing/components/colorchooser.html

Closing Windows 1 To close a window: Call frame.dispose(). Frees all associated resources 63 To configure what the close button does: Use myframe.setdefaultcloseoperation(x), where x is WindowConstants.HIDE_ON_CLOSE (default, hides but does not dispose) WindowConstants.DO_NOTHING_ON_CLOSE WindowConstants.DISPOSE_ON_CLOSE WindowConstants.EXIT_ON_CLOSE

WindowListener To add an "are you sure?" dialog: Use DO_NOTHING_ON_CLOSE Add a WindowListener 64 package java.awt.event; public interface WindowListener extends EventListener { public void windowopened(windowevent e); public void windowclosing(windowevent e); public void windowclosed(windowevent e); public void windowiconified(windowevent e); public void windowdeiconified(windowevent e); public void windowactivated(windowevent e); public void windowdeactivated(windowevent e); Called when the close button is pressed

WindowAdapter Don't want to implement every method? Extend WindowAdapter 65 package java.awt.event; public class WindowAdapter implements WindowListener { public void windowopened(windowevent e) { public void windowclosing(windowevent e) { public void windowclosed(windowevent e) { public void windowiconified(windowevent e) { public void windowdeiconified(windowevent e) { public void windowactivated(windowevent e) { public void windowdeactivated(windowevent e) { Empty implementations of all methods

Adding a Dialog Adding an appropriate listener: 66 public class GUIcreator { private class CloseButtonHandler extends WindowAdapter { public void windowclosing(final WindowEvent e) { int answer = JOptionPane.showConfirmDialog (f, "Do you really want to quit?", "Quit?", JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) { System.exit(0); public static void addcloselistener(final Frame f) { f.setdefaultcloseoperation(windowconstants.do_nothing_on_close); f.addwindowlistener(new CloseButtonHandler());

Alternative Solution An alternative solution (inner class): 67 public class GUIcreator { public static void addcloselistener(final Frame f) { f.setdefaultcloseoperation(windowconstants.do_nothing_on_close); f.addwindowlistener(new java.awt.event.windowadapter() { public void windowclosing(final WindowEvent e) { int answer = JOptionPane.showConfirmDialog (f, "Do you really want to quit?", "Quit?", JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) { System.exit(0); );

Debugging a GUI Program You can view the component hierarchy Select a frame (window) and press Ctrl-Shift-F1 69 The component hierarchy is dumped to standard error app.testframe[frame0,0,0,640x480,layout=java.awt.borderlayout,resizable,title=,defaul tcloseoperation=hide_on_close,rootpane=javax.swing.jrootpane[,4,25,632x451,lay out=javax.swing.jrootpane$rootlayout,alignmentx=null,alignmenty=null,border=,flag s=3666,maximumsize=,minimumsize=,preferredsize=],rootpanecheckingenabled=true] javax.swing.jrootpane[,4,25,632x451,layout=javax.swing.jrootpane$rootlayout,ali gnmentx=null,alignmenty=null,border=,flags=3666,maximumsize=,minimumsize=,p referredsize=] javax.swing.jpanel[null.contentpane,0,0,632x451,layout=javax.swing.jrootpane $1,alignmentX=null,alignmentY=null,border=,flags=34,maximumSize=,minimu msize=,preferredsize=,defaultlayout=java.awt.flowlayout[hgap=5,vgap=5,align =center]] app.testframe$datecomponent[,0,0,632x451,alignmentx=null,alignmenty= null,border=,flags=0,maximumsize=,minimumsize=,preferredsize=]

Pluggable Look and Feel Swing: Can replace the look and feel dynamically Nimbus (current Java standard) 70 Metal (earlier Java standard) Windows classic http://docs.oracle.com/javase/tutorial/ uiswing/lookandfeel/