Frames, menyer och GUI-program



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

Händelsestyrda program

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Grafiska komponenter.

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

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

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

Applets med komponenter

Laboration 15 Grafiskt användargränssnitt

Lab5 för prgmedcl04 Grafik

Objektorienterad programmering i Java. Föreläsning 5 Kort om Java-Applets

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

OOP Objekt-orienterad programmering

Objektorienterad programmering i Java

5 Användargränssnitt. 5.1 AWT och Swing

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

Programstyrd / händelsestyrd

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

Mer om grafiska komponenter. Händelsestyrda program

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag 00 - juni - 17 Tentamen i Objektorientering och Java Skrivtid 5 h

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

ITK:P1 Föreläsning 8. Verktyget Javadoc. Kommentarer för Javadoc. Multimedia för spelkonstruktion

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Lektion Händelsehanterare

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Klasshierarkier. Klasser kan byggas på redan definierade klasser

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

Övningar Dag 2 En första klass

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Rita Egna Bilder, Timer

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

OOP Objekt-orienterad programmering

Föreläsning 14: Grafik & mera händelsehantering

Konstruktion av klasser med klasser

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Tentamen i Objektorienterad programmering

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

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

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Objektsamlingar i Java

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

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

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Grundläggande programmering med C# 7,5 högskolepoäng

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

Lite logik. Kap 6: Sid 2

Tentamen OOP

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Skapa ett register över din grupp/klass

Objektorienterad programmering D2

Laboration 4: Game of Life

Vad är ett Framework? 2203$ ) UHOlVQLQJ. Hollywood. Frameworks (FW) Frameworks. Konstruktion av fönster, gränssnitt och användning av grafik i Java

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

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

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

Projekt 2 XL. Observer-mönstret

Klasshierarkier - repetition

OOP Objekt-orienterad programmering

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

Föreläsning 13: Swing (GUI), händelser, timer

Styra olika typer av objekt som animering, video, ljud och Flashfilm

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

Labbinstruktioner för Java/Swing

Repetitionsföreläsning 2: Quiz & problemlösning med swing Inget nytt material.

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

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Omentamen FYTA11 Javaprogrammering

FactoryCast HMI. Premium & Quantum PLC. Applets

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Programuppbyggnad från komponenter (en liten orientering)

Objektorienterad programmering Föreläsning 15. Grafiska användargränssnitt (GUI Graphical User Interface)

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Tentamen i Objektorienterad programmering

Fördjupad Java. Undantagshantering. Fel

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Tentamen Objekt-orienterad programmering med Java, 1DL100 Sommarkurs och distanskurs

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Att använda Java SE JDK 6

Laboration 10 - NetBeans

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

Editering, Kompilering och Exekvering av Javaprogram

Tentamen , Grundläggande programmering i Java

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

OOP Objekt-orienterad programmering

Tentamen FYTA11 Javaprogrammering

Tentamen, EDAA20/EDA501 Programmering

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin Micael Karlsson

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

JAVA Mer om klasser och objektorientering

Föreläsning 7. Träd och binära sökträd

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

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.

2. Komma igång Skapa grupper och elever Skriv också ut sidan 13 så att eleverna har en snabbguide till programmet.

Transkript:

15 Frames, menyer och GUI-program Frames En frame-klass Om konstruktorer - igen Funktionella fönster Menyer Popupmenyer GUI-applikationer Dialogrutor Printerutskrift

Kap 15: Sid 2 Frames Redan i kapitel 3 skapade vi en Frame Dags att återuppta bekantskapen! En frame är ett fönster med en titellist och en ram. Vi kan använda frames som komponenter i applets. Mest används de för att bygga fristående applikationer. Vi ska se på båda tillämpningarna. Vi börjar med en applet med en knapp. När man trycker på knappen ska en frame visas. import java.applet.*; import java.awt.event.*; public class FrameTest extends Applet implements ActionListener Frame f; Button b; Label l; public void init() b = new Button("Visa en frame!"); add(b); b.addactionlistener(this); public void actionperformed(actionevent e) f = new Frame(); f.settitle("min första frame"); l=new Label("Detta är en frame!"); f.add(l); f.setsize(300,200); f.setresizable(true); f.setvisible(true); När man trycker på knappen instansieras ett frame-objekt ur klassen Frame. Med settitle() kan man bestämma vad som ska stå i titellisten. På raden därefter adderas labeln till vår frame. Man måste alltid sätta storlek på en frame (sker med setsize() ) Vår frame får storleken 200x300 pixels. Vi kommer att kunna ändra storlek på den ( setresizable(true) ) Slutligen görs komponenten synlig med setvisible(true) Övning: Visa en Frame Provkör ovanstående applet. Tryck på knappen skapa en frame. Flytta på den. Tryck igen skapa fler frames. Testa att ändra storlek (fungerar) Testa att minimera, maximera, stänga (allt fungerar utom stängning) När du stänger appleten stängs alla öppnade frames. Övning: Hur ärver klassen Frame? Gå in i dokumentationen och studera hur klassen Frame ärver. ( Frame ärver från Window som ärver från Container som ärver från Component som ärver från Object ) När vi i fortsättningen använder det svenska ordet fönster avses frame (och inte window ) om inget annat anges. Java15_FrameMenyGUI.doc Ove Lundgren 2

Kap 15: Sid 3 En frame-klass Vi gör en variant på förra övningen. Denna gång ska vi skapa en egen, fristående, frame-klass, en klass som ärver från Frame, alltså. Övning: En mycket enkel frame Skriv in, spara och kompilera filen MinFrame.java class MinFrame extends Frame Skriv in, spara och kompilera filen VisaFrame.java import java.applet.*; import java.awt.event.*; public class VisaFrame extends Applet implements ActionListener MinFrame f; //Här deklareras ett objekt av typ MinFrame Button b; public void init() b = new Button("Tryck här"); add(b); b.addactionlistener(this); public void actionperformed(actionevent e) if (f!=null) // Här testas om en frame redan är öpppen f.setvisible(false); // Om den är det så stängs den! f.dispose(); // Du kan bara öppna ett fönster åt gången // i den här versionen! f = new MinFrame(); // Här instansieras ett objekt av typen f.setsize(200,200); // MinFrame f.setlocation(200,200); // Bestämmer plats på skärmen f.setresizable(true); f.setvisible(true); Skriv också en VisaFrame.html -fil och provkör. Vi får ungefär samma funktion som i förra övningen. Den här gången kan vi dock bara öppna en frame åt gången på grund av testen som görs i VisaFrame. Fönstret hamnar med sitt övre vänstra hörn i skärmposition (200,200) Det går fortfarande inte att stänga fönstret. För att göra det måste vi skriva lite kod. Nu när vi har skapat en egen frame-klass har vi alla möjligheter att bygga in önskad funktionalitet i vår frame! I nästa övning ska vi se till att vår frame går att stänga. Dessutom vill vi ha en text i titellisten Java15_FrameMenyGUI.doc Ove Lundgren 3

Kap 15: Sid 4 Övning: Stäng fönstret! Skriv om klassen MinFrame enligt nedan. Läs kommentarerna! import java.awt.event.*; class MinFrame extends Frame implements WindowListener public MinFrame() // konstruktor settitle("min Frame"); addwindowlistener(this); WindowListener är ett gränssnitt som gör att vi kan implementera metoderna (händelsehanterarna) som har med fönsterhantering att göra. Vår frame kommer att få titeln Min Frame Här klistar vi även på en fönsterlyssnare. public void windowclosing(windowevent e) setvisible(false); dispose(); public void windowclosed(windowevent e) public void windowopened(windowevent e) public void windowiconified(windowevent e) public void windowdeiconified(windowevent e) public void windowactivated(windowevent e) public void windowdeactivated(windowevent e) Anropas när fönstret stängs Vi måste släpa på alla metoderna som gränssnittet hanterar även om vi inte använder dem! Spara filen MinFrame.java. Kompilera. Kör VisaFrame och klicka på knappen. Ett fönster öppnas. Fönstret har en titeltext och, framför allt, fönstret går att stänga! Som du ser är det många metoder som ska vara med i koden när vi implementerar gränssnittet WindowListener. Kommer du ihåg vad en adapterklass är? (Om inte: Repetera avsnittet om adapterklasser i kapitel 10 ) Naturligtvis finns det en adapterklass för metoderna i gränssnittet WindowListener. Adapterklassen heter WindowAdapter Om vi använder adapterklasser kan klassen ovan skrivas så här: import java.awt.event.*; class MinFrame extends Frame public MinFrame() // konstruktor settitle("min Frame"); addwindowlistener(new FonsterLyssnare() ); class FonsterLyssnare extends WindowAdapter public void windowclosing(windowevent e) setvisible(false); dispose(); Inre klass som ärver WindowAdapter Ändra så att MinFrame använder adapterklassen WindowAdapter. Spara kompilera kör! Java15_FrameMenyGUI.doc Ove Lundgren 4

Kap 15: Sid 5 Välj själv om du vill implementera WindowListener (och ta med alla metoderna i koden) eller om du vill arbeta med inre klasser som ärver adapterklassen WindowAdapter. (I detta kapitel används genomgående adapterklassen för fönsterhändelserna) Övning: Två konstruktorer Ändra i MinFrame så att klassen får dessa båda konstruktorer: public MinFrame() // Samma konstruktor som förut // Inget argument settitle("min Frame"); addwindowlistener(new FonsterLyssnare()); public MinFrame(String s, Color c) // Ny konstruktor: // Ett argument av typen String settitle(s); // och ett av typen Color setbackground(c); addwindowlistener(new FonsterLyssnare()); Spara MinFrame.java och kompilera. I VisaFrame, i actionperformed, byt ut f = new MinFrame() mot f = new MinFrame("Heja Åmål", Color.blue); Nu kommer den andra, den nya, konstruktorn att användas eftersom den "matchar" instansieringssatsen: Spara - Kompilera -Testa! Fönstret visas. Den sträng som var argument vid instansieringen står på titellisten. Java15_FrameMenyGUI.doc Ove Lundgren 5

Kap 15: Sid 6 Funktionella fönster Nu ska vi bygga in lite funktionalitet i ett fönster. Vi lägger in tre knappar. Genom att trycka på dem kan vi ändra fönstrets bakgrundsfärg. Observera att frames automatiskt har borderlayout! Övning: Ett fönster med knappar Skriv koden. Spara som KnappFrame.java. Kompilera. import java.awt.event.*; class KnappFrame extends Frame implements ActionListener Button b1, b2, b3; public KnappFrame() // konstruktorn! settitle("min Frame"); b1=new Button("Rött"); b1.addactionlistener(this); b2=new Button("Grönt"); b2.addactionlistener(this); b3=new Button("Blått"); b3.addactionlistener(this); add("west",b1);add("south",b2);add("east",b3); addwindowlistener(new FonsterLyssnare() ); public void actionperformed(actionevent e) if (e.getsource()==b1) setbackground(color.red); else if (e.getsource()==b2) setbackground(color.green); else if (e.getsource()==b3) setbackground(color.blue); repaint(); class FonsterLyssnare extends WindowAdapter public void windowclosing(windowevent e) setvisible(false); dispose(); Gå igenom koden noga. (Du bör känna igen allt.) Ändra i VisaFrame.java så att fönsterobjekt av typ KnappFrame skapas och visas då man trycker på knappen. När du trycker på knapparna i fönstret ändras bakgrundsfärgen Java15_FrameMenyGUI.doc Ove Lundgren 6

Kap 15: Sid 7 Menyer I frames kan man använda menyer Övning: Menyer Skriv in filen nedan. Spara den som MenyFrame.java och kompilera. Ändra så att VisaFrame kan visa fönstret MenyFrame. Spara - kompilera - provkör. Läs kommentarerna efter koden. import java.awt.event.*; class MenyFrame extends Frame implements ActionListener MenuBar mbar; Menu fargmeny; MenuItem rod, gro, bla, gul; Menu svmeny; MenuItem sva, vit, gra; public MenyFrame() // konstruktorn settitle("en frame med menyer"); mbar = new MenuBar(); fargmeny = new Menu("Färger"); rod = new MenuItem("Rött"); fargmeny.add(rod); rod.addactionlistener(this); gro = new MenuItem("Grönt"); fargmeny.add(gro); gro.addactionlistener(this); bla = new MenuItem("Blått"); fargmeny.add(bla); bla.addactionlistener(this); gul = new MenuItem("Gult"); fargmeny.add(gul); gul.addactionlistener(this); mbar.add(fargmeny); svmeny = new Menu("SvartVitt"); sva = new MenuItem("Svart"); svmeny.add(sva); sva.addactionlistener(this); vit = new MenuItem("Vitt"); svmeny.add(vit); vit.addactionlistener(this); gra = new MenuItem("Grått"); svmeny.add(gra); gra.addactionlistener(this); mbar.add(svmeny); this.setmenubar(mbar); addwindowlistener(new FonsterLyssnare() ); public void actionperformed(actionevent e) if (e.getsource()==rod) setbackground(color.red); else if (e.getsource()==gro)setbackground(color.green); else if (e.getsource()==bla) setbackground(color.blue); else if (e.getsource()==gul) setbackground(color.yellow); else if (e.getsource()==sva)setbackground(color.black); else if (e.getsource()==vit) setbackground(color.white); else if (e.getsource()==gra) setbackground(color.gray); repaint(); class FonsterLyssnare extends WindowAdapter public void windowclosing(windowevent e) setvisible(false); dispose(); Java15_FrameMenyGUI.doc Ove Lundgren 7

Kap 15: Sid 8 Högst upp i fönstret ser vi nu en "menylist" (MenuBar) På denna finns två menyer (Menu) med texterna "Färger" respektive "SvartVitt". Den vänstra menyn har fyra menyalternativ (MenuItem) den högra har tre. MenuBar Menu Menu Item Vår menylist (MenuBar) refererar vi till som mbar. Menyerna kallar vi fargmeny respektive svmeny. fargmeny har menyalternativen rod, gro, bla, gul. svmeny har menyalternativen sva, vit, gra I konstruktorn instansieras objekten: Menylisten: Första menyn: mbar = new MenuBar(); fargmeny = new Menu("Färger"); De alternativ som hör till denna meny instansieras, adderas till menyn och förses med en lyssnare: rod = new MenuItem("Rött"); fargmeny.add(rod); rod.addactionlistener(this); (på samma sätt för övriga alternativ ) Sedan adderas den "färdigkomponerade" menyn till menylisten: mbar.add(fargmeny); Andra menyn (svmeny) och dess objekt behandlas på motsvarande sätt Slutligen måste den kompletta menylisten anknytas till vår frame och det sker med: this.setmenubar(mbar); Händelsehanteraren som används vid menyhantering är actionperformed(avtionevent e) (samma som för Buttons alltså) så vi använder addactionlistener när vi adderar lyssnare. Metoden actionperformed() i denna frame är mycket lik motsvarande metod i föregående övning (den med knappar) Java15_FrameMenyGUI.doc Ove Lundgren 8

Kap 15: Sid 9 Övning: Undermenyer. Vi vill skapa en undermeny under alternativet "Grått", så här: Det är enkelt: Vi definierar gra som en Menu och skapar tre nya MenuItems: ljugra, melgra, morgra De nya menyalternativen adderas förstås till menyn gra. När menyn gra är färdigkomponerad adderas den till menyn svmeny Gör alltså tillägg och ändringar enligt följande: Menu svmeny; MenuItem sva, vit; Menu gra; MenuItem ljugra, melgra, morgra; svmeny = new Menu("SvartVitt"); sva = new MenuItem("Svart"); svmeny.add(sva); sva.addactionlistener(this); vit = new MenuItem("Vitt"); svmeny.add(vit); vit.addactionlistener(this); gra = new Menu("Grått"); ljugra = new MenuItem("Ljusgrått"); gra.add(ljugra); ljugra.addactionlistener(this); melgra = new MenuItem("Mellangrått"); gra.add(melgra); melgra.addactionlistener(this); morgra = new MenuItem("Mörkgrått"); gra.add(morgra); morgra.addactionlistener(this); svmeny.add(gra); mbar.add(svmeny); Spara, kompilera och kör VisaFrame. Java15_FrameMenyGUI.doc Ove Lundgren 9

Kap 15: Sid 10 Popupmenyer Popupmenyer fungerar som vanliga menyer men man behöver ju inte någon MenuBar. Popupmenyn adderas direkt till fönstret. Så måste man förstås ha en muslyssnare som känner av om man klickar Testa gärna detta fönster. (Provkör det med VisaFrame.) import java.awt.event.*; class PopupMenyFrame extends Frame implements ActionListener, MouseListener PopupMenu fargmeny; MenuItem rod, gro, bla, gul; public PopupMenyFrame() // konstruktorn settitle("en frame med popupmeny"); fargmeny = new PopupMenu("Färger"); rod = new MenuItem("Rött"); fargmeny.add(rod); rod.addactionlistener(this); gro = new MenuItem("Grönt"); fargmeny.add(gro); gro.addactionlistener(this); bla = new MenuItem("Blått"); fargmeny.add(bla); bla.addactionlistener(this); gul = new MenuItem("Gult"); fargmeny.add(gul); gul.addactionlistener(this); this.add(fargmeny); addwindowlistener(new FonsterLyssnare() ); addmouselistener(this); public void actionperformed(actionevent e) if (e.getsource()==rod) setbackground(color.red); else if (e.getsource()==gro)setbackground(color.green); else if (e.getsource()==bla) setbackground(color.blue); else if (e.getsource()==gul) setbackground(color.yellow); repaint(); class FonsterLyssnare extends WindowAdapter public void windowclosing(windowevent e) setvisible(false); dispose(); public void mousepressed(mouseevent e) if(e.ismetadown() ) // kollar om höger musknapp tryckts fargmeny.show(this,e.getx(), e.gety() ); public void mousereleased(mouseevent e) public void mouseclicked(mouseevent e) public void mouseentered(mouseevent e) public void mouseexited(mouseevent e) Observera hur man känner av höger musknapp Java15_FrameMenyGUI.doc Ove Lundgren 10

Kap 15: Sid 11 GUI-applikationer Hittills har vi mest arbetat med applets, och ibland, då och då, med fristående konsolprogarm. Det är hög tid att skapa vår första GUI-applikation, det vill säga en fristående java-applikation med frames! (GUI = Graphic User Interface ) Redan i kapitel 3 visade vi hur det går till: Man skriver ett javaprogram (som innehåller metoden main) och så låter vi main instansiera ett frame-objekt och visa det. Övning: En GUI-applikation Vi vill visa vår frame KnappFrame som ett fristående fönster, som en egen GUI-applikation: Skriv nedanstående lilla fil. Spara den som StartaFrame.java Spara den i samma mapp som filerna KnappFrame.java och KnappFrame.class Kompilera. class StartaFrame public static void main( String args[]) KnappFrame f; f = new KnappFrame(); // Instansierar ett objekt av typ KnappFrame f.setsize(400,300); // Sätter storlek på fönstret f.setlocation(200,200); // Fönstrets placering f.setresizable(true); // Tillåter användaren att ändra storlek f.setvisible(true); // Visar fönstret I KnappFrame.java måste vi göra ett tillägg. Eftersom vår frame ska leva sitt eget liv måste vi se till att den stängs ordentligt (det skötte appleten förut) Gör tillägget System.exit(0); i metoden windowclosing( ), så här: public void windowclosing(windowevent e) setvisible(false); dispose(); System.exit(0); // stänger applikationen helt Spara KnappFrame.java och kompilera. Exekvera nu StartaFrame (med kommandot java) KnappFrame visas som en fristående applikation! Java15_FrameMenyGUI.doc Ove Lundgren 11

Kap 15: Sid 12 Vi skapade (av pedagogiska skäl) en särskild class-fil som endast innehöll en main-metod. Det är inte nödvändigt att skapa en särskild klass för main-metoden. Vi kan lika gärna skriva main-metoden direkt i frame-klassen! När frame-klassen exekveras startar den med att leta upp main-metoden, och när main-metoden utförs så instansieras ett objekt ur frame-klassen. (Klassen instansierar alltså objekt ur sig själv!) Övning: GUI-applikationen - igen Markera och kopiera main-metoden i StartaFrame-klassen Klistra in den i KnappFrame-klassen. Det spelar ingen roll var man placerar den. (Man brukar oftast lägga den först eller sist.) Så här kan det se ut: import java.awt.event.*; class KnappFrame extends Frame implements ActionListener public static void main( String args[]) KnappFrame f; f = new KnappFrame(); f.setsize(400,300); f.setlocation(200,200); f.setresizable(true); f.setvisible(true); Button b1, b2, b3; public KnappFrame() // konstruktorn! settitle("min Frame"); b1=new Button("Rött"); b1.addactionlistener(this); b2=new Button("Grönt"); b2.addactionlistener(this); b3=new Button("Blått"); b3.addactionlistener(this); add("west",b1);add("south",b2);add("east",b3); addwindowlistener(new FonsterLyssnare() ); och så vidare... Spara kompilera provkör! Övning: GUI-applikation med menyer Gör om MenyFrame till en fristående javaapplikation genom att tillfoga en main-metod. Kom ihåg att tillse att MenyFrame stängs ordentligt vid avslut. Java15_FrameMenyGUI.doc Ove Lundgren 12

Kap 15: Sid 13 Övning: Från applet till GUI-applikation Ta fram en gammal applet, Cirkel.java (Testa först att den fungerar!) Vi ska göra de ändringar som krävs för att appleten ska bli en fristående applikation. Vi kallar klassen CirkelApp. Den ska ärva från frame och implementera några lyssnare: public class CirkelApp extends Frame implements ActionListener Skriv klassens konstruktor: public CirkelApp() I denna: Välj (eventuellt) flowlayout: setlayout(new FlowLayout()); Associera fönsterlyssnaren till fönstret: addwindowlistener(new FonsterLyssnare() ); Kopiera satserna i init-metoden (och i eventuell start-metod) till konstruktorn och ta bort denna (dessa) metod(er). Lägg in en inre klass för att hantera fönstret: class FonsterLyssnare extends WindowAdapter public void windowclosing(windowevent e) setvisible(false); dispose(); System.exit(0); Lägg till en main-metod: public static void main( String args[]) CirkelApp f; f = new CirkelApp(); f.setsize(400,300); f.setresizable(true); // eventuellt f.setlocation(200,200); f.setvisible(true); Spara som CirkelApp.java Kompilera och provkör Den f d appleten uppträder nu som en fristående applikation Mer att tänka på: I applets som inte har händelsehantering: Kom ihåg import java.awt.event.*; Lägg satser som används vid dubbelbuffring (createimage och getgraphics) i windowopened() Satser i appletens stop- och destroy-metod lägger du först i windowclosing() och ta bort stop-och destroy-metoderna. Ljud och bild hanteras på lite annat sätt än i applets: Se nästa avsnitt! Övning: Applet till applikation Välj någon annan applet. Skriv om den som applikation. Java15_FrameMenyGUI.doc Ove Lundgren 13

Kap 15: Sid 14 Bild och ljud i applikationer Bild Gör så här för att visa en bild, som är lagrad på en fil, i en applikation: Deklarera en referens Image-objekt: Image bild; Denna sats skapar Image-objektet im och hämtar bilden från fil: im = Toolkit.getDefaultToolkit().getImage("minbild.gif"); Ljud Importera paketen sun.audio och java.io : import sun.audio.*; import java.io.*; Deklarera dessa objektreferenser: InputStream in; AudioStream as; Skapa ett FileInputStream-objektet, in (Öppna en inputstream till ljudfilen): try in = new FileInputStream("ljud.au"); catch(filenotfoundexception fnfe ) Skapa ett AudioStream-objekt, as, från in: try as = new AudioStream(in); catch(ioexception ioe) Ljudet spelas upp med: AudioPlayer.player.start(as); Ljudet stoppas med: AudioPlayer.player.stop(as); Om du vill ha ett kontinuerligt ljud: Deklarera även dessa objektreferenser: AudioData data ; ContinuousAudioDataStream cas; Lägg till satserna: try data = as.getdata(); catch(ioexception ioe) cas = new ContinuousAudioDataStream (data); Ljudet spelas upp med: Ljudet stoppas med: AudioPlayer.player.start(cas); AudioPlayer.player.stop(cas); ( Källa: http://www.javaworld.com/javaworld/javatips/ Tips nummer 24 ) Java15_FrameMenyGUI.doc Ove Lundgren 14

Kap 15: Sid 15 Dialogrutor En dialogruta (objekt ur klassen Dialog ) är ett fönster utan ram men med titellist. Övning: Meddelanderuta Öppna en applikation, förslagsvis KnappFrame.java Lägg till ytterligare en knapp, b4: Button b1, b2, b3, b4; b4=new Button("Visa meddelande"); b4.addactionlistener(this); add("north",b4); Deklarera en dialogruta, d, samt en label, en knapp och en panel som ska finnas på dialogrutan: Dialog d; Label dlabel; Button dbutton; Panel dpanel; Instansiera objekten och addera dem till dialogrutan. Knappen ska dessutom få en lyssnare: d = new Dialog(this, "Meddelande", true); dpanel = new Panel(); dlabel = new Label("Detta är ett meddelande!"); dbutton=new Button("Stäng"); d.add("center", dpanel); dpanel.add(dlabel); dpanel.add(dbutton); dbutton.addactionlistener(this); Gör tilläg i actionperformed() så att de nya knapparna får respons: if (e.getsource()==b4 &&!d.isshowing() ) // knapp b4 öppnar såvida inte // dialogrutan redan visas d.setsize(200,100); d.setlocation(200,200); d.setvisible(true); if (e.getsource()==dbutton) // knapp dbutton på dialogrutan gör att // dialogrutan stängs d.setvisible(false); d.dispose(); Spara filen. kompilera och provkör. När du klicka knappen Visa meddelande visas dialogrutan. Försök att ändra fönstrets bakgrundsfärg medan dialogrutan visas. Det går inte. Denna dialogruta är modal. Det betyder att man måste stänga dialogrutan innan man kan påverka andra fönster. Dialogrutan instansierades med satsen d = new Dialog(this, "Meddelande", true); Första argumnetet ska vara ett frame-objekt, nämligen det fönster från vilket dialogrutan startas. Den andra argumentet är texten i dialogrutans titellist. Den tredje argumentet anger om dialogrutan ska vara modal eller ej. Ändra tredje argumentet från true till false. Spara. Kompilera. Provkör. Dialogrutan är nu icke-modal. I vårt exempel kan färgerna ändras medan dialogrutan visas Java15_FrameMenyGUI.doc Ove Lundgren 15

Kap 15: Sid 16 Printerutskrift Från en applikation kan vi få utskrift på printer. Här är ett testprogram. Läs kommentarer nedan import java.awt.event.*; class SkrivTest extends Frame implements ActionListener PrintJob pjobb; Graphics pg; Button b; public SkrivTest() settitle("skrivtest"); b = new Button("Utskrift"); add("south",b); b.addactionlistener(this); addwindowlistener(new FonsterLyssnare() ); public void paint(graphics g) g.setcolor(color.lightgray); g.fillrect(50,50,250,80); g.setfont( new Font("Helvetica",Font.BOLD,30) ); g.setcolor(color.red); g.drawstring("hallå Java",100,100); public void actionperformed(actionevent e) pjobb = this.gettoolkit().getprintjob(this,"utskrift",null); if(pjobb!=null) pg = pjobb.getgraphics(); if(pg!=null) pg.setcolor(color.lightgray); pg.fillrect(50,50,250,80); pg.setfont( new Font("Helvetica",Font.BOLD,30) ); pg.setcolor(color.red); pg.drawstring("hallå Java",100,100); pg.dispose(); pjobb.end(); class FonsterLyssnare extends WindowAdapter public void windowclosing(windowevent e) setvisible(false); dispose(); System.exit(0); public static void main(string[] args) SkrivTest f; f = new SkrivTest(); f.setsize(360,200); f.setresizable(false); f.setvisible(true); Java15_FrameMenyGUI.doc Ove Lundgren 16

Kap 15: Sid 17 För utskrift används ett objekt av klassen PrintJob Objekt av klassen Window (som ju Frame ärver ifrån) har en metod vid namn gettoolkit() Denna metod returnerar ett objekt av en klass som heter Toolkit. Ett Toolkit -objekt har en metod getprintjob(frame f, String s, Properties p) som returnerar ett PrintJob-objekt. getprintjob(f,s,p) har tre argument: f är aktuell Frame (i vårt fall this) s är en sträng, ett namn på printerjobbet p är ett objekt av typ Properties som kan ge utskriften vissa egenskaper. Vi sätter värdet null. PrintJob-objektet (som vi kallar pjobb) instansieras med satsen pjobb = this.gettoolkit().getprintjob(this,"utskrift",null); pjobb har ett grafiskt objekt (precis som applets,frames, images ) Med pg = pjobb.getgraphics(); får vi en referens(i vårt fall pg ) till pjobbs grafiska objekt. Sen kan vi beskriva vad som ska skrivas ut, i vårt exempel, bland annat: pg.setfont( new Font("Helvetica",Font.BOLD,30) ); pg.setcolor(color.red); pg.drawstring("hallå Java",100,100); (Samma teknink som när vi byggde upp spökbilder för dubbelbuffring, alltså ) Kom ihåg och pg.dispose(); pjobb.end(); Övning: Utskrift Testa ovanstående applikation Java15_FrameMenyGUI.doc Ove Lundgren 17

Kap 15: Sid 1 Del av klasshierarkien TextComponent Event CheckBox Panel Applet Objekt Component Container Window Frame Graphics Label Dialog FileDialog CheckboxGroup Button Image List Choice Java15_FrameMenyGUI.doc Ove Lundgren 1