Forelæsning Uge 13 Torsdag

Relaterede dokumenter
Forelæsning Uge 13 Mandag

Konstruktion af grafiske brugergrænseflader (GUI'er)

Kursusgang 12. Oversigt: Sidste kursusgang Layout-manager Event-håndtering. Design af brugerflader 12.1

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

Over Forelæsning omponenter ogrammering sigt 14, 1999 freda containere 15. oktober 1999 Eksempel: out GUI til beregning fakultet.

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Hvordan organiseres et programs grafik-elementer? OOP e uge kursusgang. Advarsel! Component-objekter

DM34-1. Obligatorisk opgave Dilemma spillet. Jacob Aae Mikkelsen kok04

Serialization i Java

Videregående programmering i Java

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

Forelæsning Uge 3 Torsdag

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Forelæsning Uge 3 Torsdag

Forelæsning Uge 4 Torsdag

Kapitel 6 Events i C#

Forelæsning Uge 2 Torsdag

COMPUTERSPIL 1. Opgave 1

COMPUTERSPIL 1. Opgave 1. Opgave 2

Forelæsning Uge 4 Torsdag

DM507 Algoritmer og datastrukturer

Forelæsning Uge 12 Torsdag

Active Builder - Brugermanual

Forelæsning Uge 12 Mandag

Forelæsning Uge 2 Torsdag

DM507 Algoritmer og datastrukturer

Forelæsning Uge 2 Torsdag

Gem dine dokumenter i BON s Content Management System (CMS)

Guide til oprettelse/redigering af events på bornholm.info

Forelæsning Uge 4 Torsdag

Ugeseddel 4 1. marts - 8. marts

DRONNINGER (QUEENS) Opgave 1

I denne manual kan du finde en hurtig introduktion til hvordan du:

Introduktion til ActionScript

Objects First with Java A Practical Introduction Using BlueJ

Forelæsning Uge 3 Mandag

Introduktion til ActionScript, fortsat

Binært LAS-format Denne indstilling import Laser scan datafiler, i LAS format.

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

BILLEDREDIGERING (IMAGES)

Lektion 6. Grundlæggende programmering i VR

DM507 Algoritmer og datastrukturer

Forelæsning Uge 4 Mandag

Brugervejledning for Microstation til OpenSceneGraph konverter

Videregående programmering i Java

Forelæsning Uge 5 Mandag

Forelæsning Uge 2 Torsdag

Tegneserien - Kom godt i gang. Mikro Værkstedet A/S

Når du holder møder i Connect

photoshop udgave Udgivet af Softworld A/S

Redaktørvejledning for Skriv en artikel

Inden du går i gang. For Mozilla Firefox brugere. For Internet Explorer brugere

Vejledning i brug af dli dokumenthåndteringssystemet til virksomheder

Brugervejledning Joomla

Introduktion til CD ere og Arkivdeling Gammel Dok - September-oktober Jonas Christiansen Voss

Trimble Business Center 2.60

Selv om websites er yderst forskellige i deres fremtræden, så kan de stort set alle sammen passes ind i den skabelon som er illustreret herunder:

DMX styring med USB-interface

DM507 Algoritmer og datastrukturer

HUMANWARE BRAILLIANT INSTALLATIONSVEJLEDNING

Virkefeltsregler i Java

Vejledning til oprettelse og korrektion af brevskabeloner i TAS 1

Adobe Elements Lektion 2

Nolde Museet. I gang med Dreamweaver. Opgave. Opgavebeskrivelse. Layout. Mål og CSS

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse Styring af layout.. 5. Zoom funktioner..

Aftenskole i programmering sæson Registrering af tid. Sæson 2 - Lektion 5

5. Teknisk beskrivelse af programmet 5.1 Programmets primære strukturer Datastruktur Datastruktur

Hvad er Objekter - Programmering

Fase Forklaring Navigation. Mappen skal indeholde alle elementer til dit site.

Foto upload manual Til

Log ind i administrationspanelet

1.0 Velkommen til manualen for Editor Editorens typiske udseende HTML-kode Generelle funktioner og deres ikoner 2

Billeder og PowerPoint

Mini brugermanual CMD 5.1

Fase Forklaring Navigation. Opret en div til feltet hvorpå scrollbaren ønskes placeret. Giv div'en mål og position absolut. Vælg Overflow: auto.

Brugermanual. - For intern entreprenør

Åben Power Point... Side 2. Ny præsentation... Side 2. Dias layout... Side 2. Temaer... Side 3. Gem dit eget tema... Side 3. Diasmaster...

OrCAD Capture TCL IDE med Eclipse

Forelæsning Uge 10 Torsdag

BRUGERVEJLEDNING. Diabetesforeningens lokale hjemmesider

DM507 Algoritmer og datastrukturer

Introduktion til Flash, fortsat

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

FORCE Inspect Online Manual v FORCE Inspect Online Manual. 1 af 18

Generelt Windows tidligere versioner... 1 Windows Apple Mac Log på... 2 Rediger dokumentet Tilføj et tillægsdokument...

Adobe Acrobat Connect brugergrænsefladen

Rationel VinduesDesigner TM Brugervejledning

Sider, indlæg og projekter

Manual til Dynamicweb Februar 2010

Image Converter. Betjeningsvejledning. Indholdsfortegnelse: Version: Sørg for at læse følgende, før Image Converteren anvendes

Vejledning til opbygning af hjemmesider

Table of Contents. Prøveværktøj

Sådan opretter du en elektronisk aflevering

Formular modul. Sitecore Foundry juli Version 1.0

NR. 92 PDF-formularer med OpenOffice DEN 4. MARTS 2015

Online billede filtrering

Indhold Login flexsignage... 1 Rediger eksisterende layout... 1 Oprette et layout - template... 1 Oprette et layout tomt... 2 Designe layout...

Opret prøve og tilpas dit fronter-rum Spørgsmålstyper og justering Oversigt over spørgsmålstyper...20 Justering af spørgsmål og sider...

TYPO3 TRIN FOR TRIN 3

Transkript:

Forelæsning Uge 13 Torsdag Konstruktion af grafiske brugergrænseflader (GUI'er) Definition af de elementer, der vises på skærmen (vinduer, knapper, menuer, scrollbarer, tekster, osv.) Hvordan reagerer de på input (via mus og tastatur)? Hvordan placeres de i forhold til hinanden (layout)? Anonyme indre klasser Sprogkonstruktion, der er nyttig i forbindelse med visse GUI events Afleveringsopgave: Computerspil 4 Modifikation af den grafiske brugergrænseflade

AWT og Swing Java indeholder tre forskellige biblioteker til konstruktion af GUI'er Ældste: AWT (Abstract Window Toolkit) del af det originale Java API Mellemste: Swing (langt bedre på mange punkter) Nyeste: JavaFX Vi vil koncentrere os om brugen af Swing Mange Swing klasser er helt nye Andre erstatter AWT klasser Endelig bruger Swing også klasser fra AWT (uden at ændre dem) Når der er ækvivalente klasser i AWT og Swing, tilføjer Swing et J foran navnet Button, Frame og Menu er klasser i AWT JButton, JFrame og JMenu er klasser i Swing

Vinduer og rammer Lad os starte med at se, hvordan vi kan opbygge et vindue med nedenstående indhold Dette gøres ved hjælp af en frame (ramme) Det er operativsystemet, der bestemmer, hvordan rammen vises på skærmen (dvs. om den er øverst, delvist skjult af andre vinduer, eller helt gemt)

Terminologi for vinduer og rammer Knapper til kontrol af vinduet (minimer, maksimer, luk) Udseendet af kontrolknapperne afhænger af operativsystemet Apple Windows Titel Titelbar Menubar 3 menuer Content pane content indhold pane ramme/rude Label I am a label Af typen Container Kan indeholde forskellige GUI elementer (på tilsvarende vis som en arrayliste indeholder elementer) For dette kapitel bruger jeg engelsk terminologi Dvs. content pane (i stedet for indholdspanel). Kun danske betegnelser, hvor oversættelsen er helt oplagt (f.eks. vindue, menu og knap)

Java kode for simpel ramme (frame) Importer relevante pakker fra AWT og Swing (bemærk x'et) Feltvariabel af type JFrame Konstruktør Kalder en privat metode Initialisering af feltvariablen Erklæring af lokal variabel af type Container Erklæring af en label Tilføjes til contentpane Rammen pakkes (størrelse og layout) og gøres synlig import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ImageViewer { private JFrame frame; public ImageViewer() { makeframe(); private void makeframe() { Privat metode Indeholder al kode til konstruktion af rammen Eksempel på god "cohesion" frame = new JFrame("ImageViewer"); Container contentpane = frame.getcontentpane(); JLabel label = new JLabel("I am a label"); contentpane.add(label); frame.pack(); frame.setvisible(true); I am a label 5

Menuer private void makeframe() { frame = new JFrame("ImageViewer"); makemenubar(frame); Privat metode Al kode til konstruktion af menubaren Eksempel på god "cohesion" Har rammen (frame) som parameter Disse to linjer bevirker, at vores objekt bliver informeret, når en af de to menuindgange vælges (næste slide) Skab en menubar og lad den være menubar for rammen Skab en menu med navnet File og tilføj den til menubaren Skab en menuindgang med navnet Open og tilføj den til File menuen Skab en menuindgang med navnet Quit og tilføj den til File menuen private void makemenubar(jframe frame) { JMenuBar menubar = new JMenuBar(); frame.setjmenubar(menubar); // Create the File menu JMenu filemenu = new JMenu("File"); menubar.add(filemenu); JMenuItem openitem = new JMenuItem("Open"); filemenu.add(openitem); openitem.addactionlistener( e -> openfile()); JMenuItem quititem = new JMenuItem("Quit"); filemenu.add(quititem); quititem.addactionlistener( e -> quit()); 6

Håndtering af events (actions) Brugerne aktiverer objekterne i GUI'en ved hjælp af mus og tastatur Man kan trykke på knapper og menuindgange, indtaste tekst i tekstbokse, osv. Når et GUI objekt aktiveres af brugeren genereres et ActionEvent Dette sendes til alle de objekter, som abonnerer på ActionEvents fra det pågældende GUI objekt Man abonnerer på ActionEvents via addactionlistener metoden Parameteren til metodekaldet specificerer, hvad der skal gøres, når et ActionEvent modtages I dette tilfælde kaldes den private metode quit private void makemenubar(jframe frame) { JMenuItem quititem = new JMenuItem("Quit"); filemenu.add(quititem); quititem.addactionlistener( e -> quit()); private void quit() { System.exit(0); exit metoden i System klassen stopper udførelsen af programmet Parameterværdien 0 indikerer, at det er en normal terminering 7

Håndtering af billeder Vi introducerer tre nye klasser OFImage repræsenterer et billede OFIMage fastlægger vores interne billedformat (OF "Objects First") Bruger et 2-dimensionalt array, hvor hver pixel har en farve fra klassen Color ImageFileManger er grænsefladen til filsystemet Indeholder metoder til at konvertere billeder på en fil til et OFIMage objekt og tilbage igen samt en metode, hvor brugeren via en dialogboks kan vælge den fil, hvis billede skal vises i vinduet ImagePanel implementerer en Swing-komponent Den er en subklasse af JComponent Indeholder en metode setimage, hvor parameterværdien er det OFImage objekt, der skal vises i vinduet (rammen) 8

openfile metoden I makeframe metoden skabes et ImagePanel objekt Objektet assignes til feltvariablen imagepanel og tilføjes til contentpane private void makeframe() { imagepanel = new ImagePanel(); contentpane.add(label); Kald af getimage klassemetoden i ImageFileManager Åbner en dialogboks, hvori brugeren vælger en fil Filens billede returneres som et OFImage objekt Når brugeren vælger Open i File menuen kaldes openfile metoden Det returnerede OFImage objekt tilknyttes imagepanel Rammen pakkes og billedet dukker op i vinduet private void openfile() { OFImage image = ImageFileManager.getImage(); imagepanel.setimage(image); frame.pack(); 9

Layout Swing bruger layout managers til at bestemme, hvordan de enkelte elementer i et vindue (eller ramme) placeres i forhold til hinanden Det er en layout manager, der sørger for, at de to labels i nedenstående vindue placeres hhv. over og under billedet, og at de er venstrejusteret Det er også layout manageren, der bestemmer, hvad der sker med de tre elementer, når billedet gøres større eller mindre Der er mange forskellige layout managers Lidt større Label Lidt mindre Billede Label 10

Flow layout Elementerne placeres efter hinanden fra venstre mod højre Om nødvendigt begyndes på ny linje(r) Elementernes størrelse ændres ikke, når vinduet skaleres Den horisontale og vertikale afstand mellem elementerne er fast Hver linje centreres horisontalt Alle layout managers har parametre, der bestemmer deres detaljerede opførsel Venstre mod højre / højre mod venstre Vertikalt / horisontalt Afstand mellem elementerne Alignment, osv. Her vil vi kun se på layout managernes "normale" opførsel Se Java API'en for øvrige detaljer 11

Horisontalt box layout Ligner flow design, men opfører sig anderledes, når vinduet skaleres Elementerne placeres efter hinanden fra venstre mod højre Hvis de ikke kan være der kan de sidste ikke ses Linjen centreres vertikalt Elementernes størrelse ændres ikke, når vinduet skaleres Den horisontale afstand mellem elementerne er fast 12

Vertikalt box layout Elementer placeres under hinanden fra top mod bund Hvis de ikke kan være der kan de sidste ikke ses Elementer er venstrejusteret Elementernes størrelse ændres ikke, når vinduet skaleres Den vertikale afstand mellem elementerne er fast Om nødvendigt forkortes nogle af teksterne 13

Grid layout Elementer placeres i et gitter (grid) Elementernes får ens størrelse og denne tilpasses, så vinduet fyldes helt ud Om nødvendigt forkortes nogle af teksterne 14

Border layout Der er fem elementer (hvoraf et eller flere kan udelades) Når vinduet skaleres er det primært størrelse på center elementet, der ændres Vestlige og østlige element har fast bredde Nordlige og sydlige element har fast højde 15

Border layout (fortsat) Border layout Umiddelbart kan man tro, at border layoutet er for specielt til at være nyttigt Men det er ingenlunde tilfældet BlueJ's editor BlueJ's oversigtsvindue Border layout hvor West er meget smal Border layout hvor North og East mangler 16

Border layout (fortsat) Vores vindue med billedet er også et border layout De to labels er placeret i henholdsvis North og South, mens billedet er placeret i Center West og East er tomme Label Billede Label Erklær contentpane og sæt layoutet til Border Skab første label og placér den i NORTH Skab et ImagePanel og placér det i CENTER Skab anden label og placér den i SOUTH private void makeframe() { Container contentpane = frame.getcontentpane(); contentpane.setlayout(new BorderLayout(6, 6)); filenamelabel = new JLabel(); contentpane.add(filenamelabel, BorderLayout.NORTH); imagepanel = new ImagePanel(); contentpane.add(imagepanel, BorderLayout.CENTER); statuslabel = new JLabel(VERSION); contentpane.add(statuslabel, BorderLayout.SOUTH); 17

Indlejring af layout managers De forskellige layout managers kan bruges inde i hinanden Grid layout Vertikalt box layout Border layout Andet layout Flow layout 18

Dialogbokse og knapper Vi vil nu tilføje en Help menu Denne skal have en menuindgang, som viser en dialogboks på skærmen Skab Help menu og tilføj den til menubaren Skab menuindgang og tilføj den til Help menuen og tilføj en ActionListener, som specificerer, at det er showabout metoden, der skal aktiveres Vi kalder showmessagedialog metoden fra klassen JOptionPane Parametrene angiver Rammen hvori den skal vises Teksten der skal vises Titlen der skal vises øverst Typen (bestemmer knapperne) private void makemenubar() { helpmenu = new JMenu("Help"); menubar.add(helpmenu); item = new JMenuItem("About ImageViewer"); helpmenu.add(item); item.addactionlistener( e -> showabout()); private void showabout() { JOptionPane.showMessageDialog( frame, "ImageViewer\n" + VERSION, "About ImageViewer" JOptionPane.INFORMATION_MESSAGE); Forskellige slags dialogbokse Message Dialog: OK button Confirm Dialog: Yes, No, Cancel button Input Dialog: Tekstfelt til input + nogle knapper 19

Knapper Vi vil nu tilføje et par knapper, der kan ændre billedets størrelse Skab nyt panel og sæt dets layout mangager til GridLayout Skab den første knap og tilføj den til panelet Skab den anden knap og tilføj den til panelet Skab et nyt panel og læg det første panel derind i Det yderste panel placeres i border layoutets vestlige del private void makeframe() { JPanel toolbar = new JPanel(); toolbar.setlayout(new GridLayout(0, 1)); smallerbutton = new JButton("Smaller"); toolbar.add(smallerbutton); smallerbutton.addactionlistener(e -> makesmaller()); largerbutton = new JButton("Larger"); toolbar.add(largerbutton); largerbutton.addactionlistener(e -> makelarger()); JPanel flow = new JPanel(); flow.add(toolbar); contentpane.add(flow, BorderLayout.WEST); FlowLayout er default for paneler og dette sikrer at knapperne ikke skaleres i højden 20

Andre GUI elementer I denne forelæsning har vi kun set på nogle af de vigtigste elementer, der kan indgå i en GUI Der masser af andre Scrollbarer (klassen Scrollbar) Checkbokse (klassen Checkbox) Radiobuttons (klassen JRadioButton) Lister hvor en/flere indgange kan være selekteret(klassen JList) Dropdown lister hvor én indgang er selekteret (klassen JComboBox) Billeder (klassen ImageIcon) Kanter/rammer (interfacet Border og dets implementerende klasser) Usynlige elementer som påvirker layoutet (Box klassen) Fremgangsmåden er hele tiden den samme Skab GUI objekterne og tilføj dem til vinduer, rammer, paneler og andre Container objekter Tilknyt en passende LayoutManager til containeren Tilknyt en privat metode, som kan håndtere de events, der modtages fra GUI objektet 21

Anonyme indre klasser Indtil nu har vi specificeret event håndtering via lambda'er Lambdaen specificerer en private metode som udføres, når et event af den pågældende type modtages largerbutton.addactionlistener(e -> makelarger()); Dette har været muligt, fordi alle vores events har været af typen ActionEvent Disse aktiveres via en ActionListener, der et funktionelt interface,dvs. kun har en abstrakt metode, som kan erstattes af en lambda Desværre har Java også en del ældre "lyttere" fra AWT, der ikke er funktionelle Det gælder bl.a. KeyListener, MouseListener og MouseMotionListener Håndtering af sådanne events sker typisk ved, at man for hvert event, der kan modtages, definerer en klasse, der implementerer det pågældende Listener interface og udfører de operationer, der skal foretages Vi får derfor en masse små klasser, hvor vi kun har behov for at skabe et enkelt objekt af hver klasse Denne situation håndteres bedst ved brug af anonyme indre klasser 22

Erklæring af anonym indre klasse Vi vil nu erklære en anonym indre klasse til håndtering af mousepressed events Sådanne events generes når brugeren trykker på en museknap (udenfor specifikke kontroller såsom knapper, menuindgange, scrollbarer, osv.) Skab et ImagePanel objekt og sæt dets kant til EtchedBorder Tilknyt en MouseListener Parameteren skal være et objekt, der implementerer interfacet MouseListener Objektet erklæres på stedet Det skal være en subklasse af MouseAdapter klassen (der implementerer interfacet MouseListener) Det skal implementere metoden mousepressed (som blot kalder en privat metode handlemousepressed i vores ImageViewer klasse) private void makeframe() { imagepanel = new ImagePanel(); imagepanel.setborder(new EtchedBorder()); imagepanel.addmouselistener(new MouseAdapter() { public void mousepressed(mouseevent e) { handlemousepressed(e); ); contentpane.add(imagepanel, BorderLayout.CENTER); Objekter af den indre klasse kan kun eksistere inde i objekter af den omgivende klasse Det indre objekt har adgang til private feltvariabler og metoder i den omgivende klasse 23

Computerspil 4 I den fjerde delaflevering skal I bruge nogle af de ting, som I har lært om grafiske brugergrænseflader I skal tilføje nogle ekstra knapper, labels og tekstfelter til GUI klassen GUI kode er tricket og vanskelig at mestre Men I kan blot se, hvordan de eksisterende GUI elementer er implementeret,og så kopierer koden herfra (med trivielle modifikationer) Herudover skal I (som sædvanlig) rette gamle fejl og mangler tilføje dokumentation for nye programdele I behøver ikke at lave regression tests for jeres GUI metoder Men de skal afprøves efterhånden, som I laver dem 24

Opsummering Konstruktion af grafiske brugergrænseflader Hvilke elementer kan vises på skærmen (vinduer, knapper, menuer, scrollbarer, tekster, osv.) Hvordan reagerer de på input (via mus og tastatur) Hvordan placeres de i forhold til hinanden (layout) Anonyme indre klasser Sprogkonstruktion, der er nyttig i forbindelse med visse GUI event handlere, såsom KeyListener, MouseListener og MouseMotionListener Afleveringsopgave: Computerspil 4 Modifikation af den grafiske brugergrænseflade 25

Gode råd omkring GUI konstruktion Cohesion Placer GUI elementerne samlet (i en enkelt eller nogle få klasser) og adskilt fra de ting, der beskriver programmets øvrige funktionalitet Lad andre gøre arbejdet Brug de predefinerede GUI objekter i Swing og AWT Mange af disse kan identificere brugerevents og videregiver dem til lyttere (event listeners) Event listeners Implementeres normalt ved hjælp af lambda'er For at holde lambda'erne så korte (og læselige) som muligt, bør de blot kalder en privat metode, hvori den egentlige kode så placeres For de lyttere, der ikke er funktionelle, benyttes anonyme indre klasser 26

Det var alt for nu.. spørgsmål 27