GUI-program med Swing

Relevanta dokument
Applets med komponenter

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

Mer om grafiska komponenter. Händelsestyrda program

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

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

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

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

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

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

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

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

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

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

Lab5 för prgmedcl04 Grafik

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

OOP Objekt-orienterad programmering

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.

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

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Lite logik. Kap 6: Sid 2

Laboration 15 Grafiskt användargränssnitt

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

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

OOP Objekt-orienterad programmering

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

Grafiskt användargränssnitt (GUI-Graphical User Interface) intro Komponenter

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

SMD 134 Objektorienterad programmering

JAVA Mer om klasser och objektorientering

Föreläsning 5-6 Innehåll

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

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

För att skriva data till skärmen ( konsolen) används objektet System.out tillsammans med metoden println eller print.

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Att skriva till och läsa från terminalfönstret

Rita Egna Bilder, Timer

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

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

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

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

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

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Laboration 1 Introduktion till Visual Basic 6.0

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

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

Grafik, bilder och ljud

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

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Tentamen , Grundläggande programmering i Java

Lösningsförslag till tentamen FYTA11 Javaprogrammering

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

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

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

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Lektion Händelsehanterare

Tentamen FYTA11 Javaprogrammering

Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

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

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

System.out.println("Jaså du har "+ antaldollar + " stycken.");

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

Frames, menyer och GUI-program

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

a. Vilka av följande påståenden är riktiga? Observera att felaktigt valda påståenden ger poängavdrag. (4p)

Föreläsning 10. Mer om grafiska komponenter Händelsestyrda program. Layout Managers. Exempel: FlowLayout. Klassen FlowLayout

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

JAVAUTVECKLING LEKTION 3

Extramaterial till Matematik Y

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

4.4 Swing ett interaktivt grafiskt gränssnitt

Lösningar för tenta 3 DAT043,

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

TDDC77 Objektorienterad Programmering

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

Java-concept och Swing. Swing low, sweet chariot

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

Klassen javax.swing.timer

NetBeans 7. Avsikt. Projektfönster

Föreläsning 2 sept 05 (Onsdag v 36). DD Chapter 2.

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Eclipse. Avsikt. Nu ska ett fönster liknande figuren till höger synas.

Programmering för språkteknologer I, VT2012. Rum

Java, klasser, objekt (Skansholm: Kapitel 2)

Transkript:

Swing * Eclipse * Midlets * Android 4 GUI-program med Swing Javas AWT- och Swing-paket Ett GUI-program En JLabel En JButton Om gränssnitt Händelsehantering Skriv in text Mata in tal Aritmetik Typomvandling cast Omvandla en sträng till flyttal Klassen Math Felhantering (Undantagshantering) Avrundning En JPanel Sectordata 2010

Kap 4 : Sid 2 I det här kapitlet lär du dig bygga GUI-applikationer, alltså program med grafiskt gränssnitt. Man skapar då ett objekt ur klassen JFrame och förser det med komponenter, t.ex. textrutor och knappar. Ett JFrame-objekt är en container ( = ett objekt som kan förses med andra komponenter). När man trycker på en knapp ska ju någonting hända: Händelsehantering introduceras i kapitlet. Du lär dig hur man gör inmatningar, beräkningar och utskrifter av resultat. Företeelser som felhantering, typomvandling och avrundning genomgås. Klassen Math, som innehåller matematiska funktioner, introduceras. I kapitlets sista avsnitt får du testa att placera en JPanel i en JFrame. En JPanel är också en container och har dessutom möjlighter att visa grafik. Avsnittet är en introduktion till kapitel 5 där vi kommer att bygga GUI-applikationer just på detta sätt, med en JPanel placerad i en JFrame.

Kap 4 : Sid 3 Javas awt- och swing-paket Ett program med grafiskt användargränssnitt (graphic user interface = GUI) innehåller komponenter, exempelvis textrutor där man kan skriva in text, "etiketter" som visar text, knappar som man kan trycka på, kryssrutor där man kan göra olika val, scrollningslister etc. I Java finns ett paket som heter java.awt. Det innehåller klasser som beskriver komponenter, till exempel klasserna TextField, Label, Button, CheckBox, ScrollBar. Vi skapar exempelvis en knapp genom att instansiera ett Button-objekt, en textruta genom att instansiera ett TextField-objekt osv. Paketet java.awt innehåller också klasser och interface som handhar färger (Color), grafik (Graphics), textfonter (Font), klasser för händelsehantering och för layouter med mera. Java har ytterligare ett paket med klasser som beskriver komponenter, nämligen paketet javax.swing. Detta paket innehåller de så kallade swing-klasserna. Här finns klasserna JTextField, JLabel, JButton, JCheckBox, JScrollBar med flera. Klasserna har alltså nästan samma namn i java.awt och i javax.swing. Det som skiljer är att swing-klasserna har ett 'J' i början av namnet. Swing-klasserna är modernare än awt-klasserna och har fler möjligheter. Det finns också swing-klasser som inte har någon motsvarande awt-klass (och awt-klasser som inte har någon motsvarande swing-klass). I Java javisst+ kommer vi att använda swing-klasser när vi ska bygga GUI-program (windowsapplikationer), men vi kommer ofta att behöva importera även java.awt-paketet, för hantering av färger, layouter, händelser med mera. I kapitel 6 lär vi oss att skriva java applets (små javaprogram som exekveras på hemsidor). Vissa webbläsare har standardmässigt inte stöd för swing-klasserna. Vi har i Java javisst+ valt att konstruera applets på "traditionellt" sätt, med awt-klasserna.

Kap 4 : Sid 4 Ett GUI-program I slutet på förra kapitlet såg vi hur man skapar en GUI-applikation: Vi skriver en klass som ärver från klassen JFrame och instansierar sedan ett objekt ur den klassen. Detta objekt blir vår GUI-applikation (vårt "fönster"). Övning: En enkel GUI-applikation I Eclipse, skapa ett nytt projekt och ge det namnet Kap04. Skapa sedan en ny klass, KnappFrame, i detta projekt. Skriv koden: import javax.swing.*; public class KnappFrame extends JFrame { public KnappFrame () { Vi låter konstruktorn vara tom så länge. Vi ska snart ge den innehåll. En exekverbar javaklass, alltså ett javaprogram, har som bekant alltid en metod vid namn main(). Skapa ännu en klass, Start, i projektet Kap04 och skriv in denna kod: public class Start { public static void main(string[] args) { KnappFrame f = new KnappFrame (); f.setsize(220, 200); f.setlocation(100,100); f.settitle("min första GUI-applikation"); f.setdefaultcloseoperation(knappframe.exit_on_close); f.setvisible(true); I main()-metoden deklareras och instansieras ett KnappFrame-objekt f. Här sätts också grundläggande egenskaper: Storlek, placering, text på titelraden. Vidare tillses att applikationen stängs då man klickar på krysset i övre högerhörnet. Slutligen görs KnappFrame-objektet synligt. Programmet skapar alltså ett objekt ur klassen KnappFrame, ger det vissa grundläggande egenskaper och visar det på skärmen. Provkör! Ett tomt fönster visas. I Eclipse lägg märke till följande: Så snart du i ovanstående kod skrivit ett f (alltså referensen till objektet) samt efterföljande punkt, så visas ett fönster med alla objektets metoder. Om du i detta läge skriver ett s så visas alla metoder vars namn som börjar på bokstaven s. Om du till exempel skriver bokstäverna setv så visas de metoder vars namn börjar på denna bokstavskombination. Nu behöver du inte skriva metodnamnet, utan det räcket att du klickar på den aktuella metoden, eller markerar den med PILUPP /PILNED och sedan trycker ENTER. Då läggs metodnamnet automatiskt in i koden. Som du ser får du också hjälp att välja argument, det vill säga det som ska stå inom parentes efter metodnamnet. Semikolonet som avslutar satsen får du skriva själv!

Kap 4 : Sid 5 Det är faktiskt onödigt att ha ett speciellt program (en speciell klass) för main()-metoden! Vi kan lika gärna placera main-metoden direkt i klassen KnappFrame, så här: import javax.swing.*; public class KnappFrame extends JFrame { public KnappFrame () { Kopiera in main()-metoden i klassen KnappFrame! public static void main(string[] args) { KnappFrame f = new KnappFrame (); f.setsize(220, 200); f.setlocation(100,100); f.settitle("min första GUI-applikation"); f.setdefaultcloseoperation(knappframe.exit_on_close); f.setvisible(true); Skriv in main()-metoden i klassen KnappFrame.java och provkör! När vi startar KnappFrame så eftersöks ju en main()-metod. Om en sådan finns (och det gör det ju nu) så exekverar den, och ett objekt ur klassen KnappFrame skapas - och visas! I fortsättningen låter vi main()-metoden vara en metod i den klass ur vilken vi ska skapa objekt, och vi låter den innehålla metoder som sätter objektets grundläggande egenskaper (storlek, placering med mera). I konstruktorn placeras metoder som har med innehållet att göra. Ofta är det metoder som skapar och visar komponenter av olika slag, till exempel knappar, etiketter, textrutor. Begreppet container När vi exekverar ovanstående program visas vårt fönster, vårt KnappFrame-objekt, som också är ett JFrameobjekt eftersom klassen KnappFrame ärver från JFrame. Fönstret är än så länge tomt, men vi ska strax ge det innehåll. Vi ska förse det med diverse komponenter (etiketter, knappar och textrutor). Ett objekt som har denna egenskap, att man kan lägga komponenter på dess yta kallas för en container (en behållare). Ett JFrame-objekt är alltså en container. Vi kommer senare att arbeta med JPanels och Applets som också är containers. Om ordet this Inför kommande övningar kan det vara bra att känna till följande om ordet this : Ett objekts metoder anropas, som bekant, med punktnotation, så här: När ett objekt använder sina egna metoder skriver man Med ordet this pekar alltså objektet på "sig själv"! Ordet this kan utlämnas. Man kan alltså endast skriva objekt.metod(); this.metod(); metod(); I kommande övningar och exempel använder vi ibland skrivsättet this.metod(); för att öka tydligheten, men ofta utelämnas ordet this för att inte belasta koden allt för mycket.

Kap 4 : Sid 6 En JLabel En JFrame (ett "fönster") är en container på vilken man kan placera ut komponenter av olika slag. Ett objekt ur klassen JLabel är ett exempel på en komponent. Ett JLabel objekt används till att visa texter (och, som vi ska se i ett senare kapitel, även bilder). Ibland använder vi ordet etikett när vi talar om en JLabel. (Eng. label etikett) I övningen nedan ska vi lägga ett JLabel-objekt på vår KnappFrame. Klassen JLabel, och andra klasser som beskriver komponenter, finns i paketet javax.swing. Ibland behöver vi även arbeta med klasser ur det äldre paketet med grafiska komponenter, java.awt. I nedanstående övning förekommer klassen FlowLayout och denna klass finns i paketet java.awt. Vi skapar ett objekt med ordet new. Härvid anropas en speciell metod i klassen som kallas konstruktorn. (Konstruktormetoden har samma namn som klassen.) Du har sett att man ofta skriver in argument i konstruktorn. Argumenten överförs till egenskaper hos objektet. När vi skapar en JLabel är argumentet oftast en text, nämligen den text som etiketten ska visa. När man ska lägga ut en etikett i en JFrame måste man: Importera klassen JLabel (det vill säga importera paketet javax.swing ) Deklarera komponenten (t ex JLabel lbl; ). Vi tar som vana att (som i övningen nedan) deklarera komponentobjekten utanför konstruktorn så att objekten känns igen av alla metoder i klassen. Skapa objektet (t ex med lbl = new JLabel ( Detta är en JLabel! );) Dessa instansieringar gör vi i konstruktorn. Lägga ut komponenten på JFrame-ytan.. Detta sker med en JFrame-metod som heter add(), så här: this.add(b); Dessa satser skriver vi i konstruktorn. Vi förser JFrames med en layout manager. Denna bestämmer hur komponenter ska placeras ut i fönstret. I övningen nedan har vi, först i konstruktorn, lagt till satsen this.setlayout(new FlowLayout()); Detta innebär att vårt KnappFrame-objekt får flytande layout ( flow layout). Knappar och andra komponenter kommer då att placeras ut i tur och ordning centrerade, uppifrån och ned. Vi återkommer till layouter senare i kursen. Övning: Lägg in en JLabel Gör tillägg enligt nedan i klassen KnappFrame import javax.swing.*; import java.awt.*; public class KnappFrame extends JFrame { JLabel lbl; public KnappFrame () { this.setlayout( new FlowLayout() ); lbl = new JLabel("Detta är en JLabel!"); this.add(lbl); public static void main(string[] args) { KnappFrame f = new KnappFrame(); f.setsize(220, 200); f.setlocation(100,100); f.settitle("min första GUI-applikation"); f.setdefaultcloseoperation(knappframe.exit_on_close); f.setvisible(true); Provkör!

Kap 4 : Sid 7 Övning: Ändra etikettens utseende I klassen KnappFrame, skriv in dessa satser i konstruktorn, lämpligen på raden direkt efter att lbl skapats: Provkör! lbl.setfont(new Font("Arial",Font.ITALIC,20)); lbl.setforeground(color.yellow); lbl.setopaque(true); lbl.setbackground(color.blue); Vår JLabel får en ny font ( = textutseende) med metoden setfont(). Denna ska som argument ha ett objekt av klassen Font. Den vanligaste konstruktorn för ett Font-objekt har tre parametrar: Typsnitt, stil och storlek. Du kan testa typsnitt som "Times new roman", "Courier", "Verdana", "Comic sans MS" med flera. (Längre fram i detta kapitel finns ett program man kan köra för att se vilka typsnitt som finns.) Stil anges med någon av heltalskonstanterna Font.PLAIN, Font.ITALIC, Font.BOLD eller med additionen Font.ITALIC + Font.BOLD (för kursiv + fet stil). Textens storlek anges med heltal. Klassen Font tillhör paketet java.awt. Med metoden setforeground() ger man texten en färg. Metoden har ett argument - ett Color-objekt. Här kan man ange ett fördefinierat Color-objekt (t.ex.color.blue, Color.red, Color.green ) eller ett Color-objekt som man själv skapar. Vi återkommer till färger i nästa kapitel. Med metoden setopaque() väljer man om etiketten ska ha genomskinlig bakgrund eller ej. Satsen lbl.setopaque(true); gör att etiketten lbl kommer att ha en synlig bakgrund. Med metoden setbackground()väljer man bakgrundsfärg. Referenslösa objekt Vi skapar oftast objekt med referens, till exempel lbl = new JLabel("Detta är en JLabel!"); Då blir ju lbl referens till objektet (objektets "namn"). Vi kan referera till objektet i satser som lbl.setopaque(true); lbl.setbackground(color.blue); etcetera. Ibland instansierar man objekt utan att ge det en referens. Exempel: I denna sats, hämtad från övningen ovan, använder vi ett Font-objekt utan referens som argument i setfont()-metoden: lbl.setfont(new Font("Arial",Font.ITALIC,20)); Vi hade kunnat skriva koden så här: Font minfont = new Font("Arial",Font.ITALIC,20); lbl.setfont(minfont); Här har vi först skapat Font-objektet med referensen minfont, och därefter använt denna referens som argument i i setfont()-metoden. Detta är givetvis fullt korrekt, men onödigt omständligt, eftersom vi inte kommer att använda referensen minfont på fler ställen i programkoden. Ett annat exempel i övningen ovan är satsen this.setlayout(new FlowLayout()); där vi använder ett referenslöst FlowLayout -objekt som argument i metoden setlayout().

Kap 4 : Sid 8 En JButton Övning: Lägg in en knapp Vi ska nu lägga till en knapp, ett JButton-objekt. Vi ger objektet referensen b och instansierar det med argumentet "Tryck på mej!". Denna text kommer att visas på knappen. Gör tillägg enligt nedan i klassen KnappFrame import javax.swing.*; import java.awt.*; public class KnappFrame extends JFrame { JLabel lbl; JButton b; public KnappFrame () { this.setlayout(new FlowLayout()); lbl = new JLabel("Detta är en JLabel!"); lbl.setfont(new Font("Arial",Font.ITALIC,20)); lbl.setforeground(color.yellow); lbl.setopaque(true); lbl.setbackground(color.blue); b = new JButton("Tryck på mig"); this.add(b); this.add(lbl); public static void main(string[] args) { // oförändrad kod i main()-metoden Provkör! Knappen visas - men om du trycker på knappen så händer inget. Dra i kanterna : Ändra fönstrets storlek! Komponenterna placeras i ordning efter hur de "adderats", centrerade på en rad högst upp. Om de inte får plats flyttas de ned, fortfarande centrerade. Detta är FlowLayout!

Kap 4 : Sid 9 Om gränssnitt (interface) Vi ska strax gå igenom hur man får något att hända då knappen trycks (händelsehantering). Vi kommer då att behöva använda gränssnitt (som vi tog upp i Kapitel3, sista sidan). Repetition: Det är inte är tillåtet med multipelt arv i Java, det vill säga, man får inte ärva från flera klasser. Däremot kan man implementera (lägga till) ett (eller flera) gränssnitt (eng. interface) Ett gränssnitt är en speciell slags klass som bara innehåller tomma metoder avsedda att omdefinieras. Klass A Fält Metoder: metod1(){ metod2(){ metod3(){ Interface B Metoder: metoda(){ metodb(){ Klass C Fält Metoder: metod1(){ metod2(){ metod3(){ metoda(){ metodb(){ Med ordet implements implementeras gränssnittets metoder i vår nya klass. I java-kod ser det ut så här: public class C extends A implements B { Händelsehantering Naturligtvis vill vi att något ska hända när vi trycker på knappen! När någon trycker på en knapp skapas ett händelseobjekt (ett objekt ur en klass vid namn ActionEvent) Objektet är argument i en metod som heter actionperformed() och i den metoden beskriver vi vad som ska hända. En metod som beskriver vad som ska hända kallas allmänt för händelsehanterare. Metoden actionperformed() finns tyvärr inte deklarerad i klassen JFrame. Vi implementerar därför ett gränssnitt, ActionListener, där metoden actionperformed() finns. Ett JButton-objekt har en metod som heter addactionlistener() Den metoden måste anropas för att associera knappen till actionperformed()-metoden. Den gör så att knappen lyssnar på en knapptryckning och anropar actionperformed()-metoden då knappen trycks. Klasser och gränssnitt som har med händelsehantering att göra finns i ett paket som heter java.awt.event

Kap 4 : Sid 10 Fyra saker måste göras för att något ska hända då vi trycker på knappen: Importera paketet med de klasser och gränssnitt som behövs för händelsehantering: import java.awt.event.* ; Implementera gränssnittet ActionListener (så att vi kan använda metoden actionperformed() ) Sätt en lyssnare på knappen: Med satsen b.addactionlistener(this); anger vi att knappen b ska lyssna på en knapptryckning och anropa metoden actionperformed(). Argumentet this anger att actionperfomed() är definierad i denna (this) JFrame. (Ibland kan nämligen händelsehanteraren vara definierad i en annan klass) Omdefiniera metoden actionperformed(). Där beskrivs vad som ska ske när knappen trycks. Metoden actionperformed()startar när den tar emot ett ActionEvent-objekt, det vill säga när det har inträffat en händelse (någon har tryckt på knappen ) Övning: Byt färg på etiketten! Komplettera klassen MinJFrame med händelsehantering. När någon trycker på knappen så ska etiketten få röd bakgrundsfärg. import javax.swing.*; import java.awt.*; import java.awt.event.*; Nytt paket för händelsehantering! Implementera gränssnittet Actionlistener! public class KnappFrame extends JFrame implements ActionListener { JButton b; JLabel lbl; public KnappFrame () { this.setlayout(new FlowLayout()); lbl = new JLabel("Detta är en JLabel!"); lbl.setfont(new Font("Arial",Font.ITALIC,20)); lbl.setforeground(color.yellow); lbl.setopaque(true); lbl.setbackground(color.blue); b = new JButton("Tryck på mig"); this.add(b); b.addactionlistener(this); this.add(lbl);; Sätt lyssnare på knappen! public void actionperformed(actionevent e){ lbl.setbackground(color.red); Skriv in metoden actionperformed! public static void main(string[] args) { KnappFrame f = new KnappFrame(); f.setsize(220, 200); f.setlocation(100,100); f.settitle("min första GUI-applikation"); f.setdefaultcloseoperation(knappframe.exit_on_close); f.setvisible(true);

Kap 4 : Sid 11 Övning: Två knappar Deklarera ytterligare en knapp, b2, i KnappFrame.java : JButton b, b2; Ändra texten på knappen b: Skapa knappobjektet b2 : Lägg ut b2 den efter den första knappen: Sätt lyssnare även på b2 : b = new JButton("Blå"); b2 = new JButton("Röd"); this.add(b); this.add(b2); b2.addactionlistener(this); Gör tillägg i actionperformed-metoden: public void actionperformed(actionevent e){ if( e.getsource() == b) lbl.setbackground(color.blue); if( e.getsource() == b2) lbl.setbackground(color.red); Metoden e.getsource() returnerar referensen till det objekt som har aktiverats, det vill säga händelsens "källa" (source), den knapp som har tryckts. Alltså: Om e.getsource() == b så är händelsens "källa" knappen b, det vill säga någon har tryckt på knapp b. Som synes kommer ett tryck på knapp b att resultera i att etiketten blir blå. Vid ett tryck på knapp b2 blir etiketten röd.

Kap 4 : Sid 12 Skriv in text I kapitel 1 lärde vi oss hur man skrev konsolprogram så att en användare kunde mata in text (en sträng) via tangentbordet, och så att strängen överfördes till en strängvariabel. Vi använde metoden nextline(). För att göra motsvarande i en GUI-applikation använder vi en komponent vid namn JTextField. En JTextField komponent är en textruta i vilken man kan skriva in text. I nästa övning ska användaren kunna mata in en sträng (t.ex. ett namn). Vid knapptryck ska texten kopieras till en String-variabel och detta variabelvärde ska skrivas ut i en JLabel Övning: Skriv in en text I Eclipse, skapa en ny klass, Inmata, i projektet Kap04. Skriv koden nedan. (Du kan förstås kopiera mycket av koden från föregående övning ) import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Inmata extends JFrame implements ActionListener{ JTextField tf; JButton b; JLabel lbl1, lbl2; String namn; public Inmata() { this.setlayout(new FlowLayout()); lbl1 = new JLabel("Skriv ditt namn:"); tf = new JTextField(15); b = new JButton("Tryck här"); lbl2 = new JLabel(); add(lbl1); add(tf); add(b); add(lbl2); b.addactionlistener(this); public void actionperformed(actionevent e) { namn = tf.gettext(); lbl2.settext("hej " + namn); public static void main(string[] args) { Inmata f = new Inmata(); f.setsize(400, 150); f.setlocation(100,100); f.settitle("inmata"); f.setdefaultcloseoperation(inmata.exit_on_close); f.setvisible(true); I actionperformed() metoden ovan används metoderna gettext() och settext() : Ett JTextField-objektets metod gettext() returnerar den sträng som står i textrutan. Så med satsen namn = tf.gettext(); så kommer strängen namn att tilldelas textrutans innehåll. Ett JLabel-objekts metod settext(sträng) gör att etiketten visar det som anges som argument. Satsen lbl2.settext("hej " + namn); gör att lbl2 kommer att visa ordet "Hej" samt innehållet i strängen namn. ( Även klassen JTextField har en sådan settext()-metod.) Provkör!

Kap 4 : Sid 13 Övning: Textfältet kan lyssna! Lägg in en lyssnare även på textfältet! Skriv in denna sats i konstruktorn: tf.addactionlistener(this); Provkör: Skriv in ett namn i textfältet och tryck på ENTER. Du får samma reaktion som om du tryckt på knappen. Övning: Ändra textens utseende I klassen Inmata, ge labeln lbl2 ny font och ny förgrundsfärg, till exempel : lbl2.setfont(new Font("Arial",Font.ITALIC,40)); lbl2.setforeground(color.blue); Vilka typsnitt finns? I äldre java-versioner fanns ett begränsat antal typsnitt ( Arial, Times New Roman m.fl.) Senare versioner har fler att välja på. Detta lilla konsolprogram visar vilka typsnitt som finns i din utvecklingsmiljö: import java.awt.*; public class Typsnitt{ public static void main(string[] args){ GraphicsEnvironment ge ; ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] font = ge.getavailablefontfamilynames(); for (int i = 0; i < font.length; i++) { System.out.println(font[i]); Testa gärna: Skapa klassen Typsnitt, kopiera in koden och kör! (Programmet innehåller kod som vi för tillfället avstår från att förklara.)

Kap 4 : Sid 14 Mata in tal I övningen nedan ska vi mata in tal i två JTextFields, addera talen och skriva ut summan. Övning: Mata in tal I Eclipse, skapa en ny klass, InmataTal, i projektet Kap04. Skriv koden nedan. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class InmataTal extends JFrame implements ActionListener { JTextField tf1, tf2; JButton b; JLabel lbl1, lbl2; int x, y, summa; public InmataTal() { this.setlayout(new FlowLayout()); lbl1 = new JLabel("Skriv ett tal i vardera rutan"); tf1 = new JTextField(5); tf2 = new JTextField(5); b = new JButton("Addera talen!"); lbl2 = new JLabel(); add(lbl1); add(tf1); add(tf2); add(b); add(lbl2); b.addactionlistener(this); tf1.addactionlistener(this); tf2.addactionlistener(this); public void actionperformed(actionevent e) { x = Integer.parseInt(tf1.getText() ); y = Integer.parseInt(tf2.getText() ); summa = x + y; lbl2.settext("summan är " + summa ); public static void main(string[] args) { InmataTal f = new InmataTal(); f.setsize(200, 200); f.setlocation(100,100); f.settitle("mata in tal"); f.setdefaultcloseoperation(exit_on_close); f.setvisible(true); Provkör! Summan beräknas om du trycker på knappen, eller om du trycker på ENTER då markören står i någon av inmatningsrutorna!

Kap 4 : Sid 15 Kommentarer till koden: Vi instansierar två inmatningsrutor (JTextField-objekt), tf1 och tf2 Vi har också lagt in en knapp, och några JLabel-objekt för utskrifter. Det finns tre heltalsvariabler. De heter x, y och summa I metoden actionperformed() hittar vi en ny metod, parseint() Du vet sedan förra exemplet att metoden gettext() ger den text (de bokstäver eller siffror) som skrivs in i en textruta. Om vi till exempel matar in en 1:a, en 2.a och en 3:a får vi textsträngen "123" Ibland (som här) vill vi tolka en textsträng (t ex "123") som ett tal istället (här talet 123 ) (Det går ju exempelvis inte att räkna med textsträngar - vare sig de består av bokstäver eller siffror!) Om en sträng enbart består av siffertecken (eventuellt även minustecken) så kan den "översättas" till ett heltal. Denna omvandling från sträng till tal sker med metoden Integer.parseInt(sträng). (Om strängen består av andra tecken genereras ett fel. Vi ska snart se hur man tar hand om ett sådant fel ) En textsträng! Integer.parseInt( "123" ) Resultatet blir ett tal: 123 Integer är en klass och parseint() är en metod i denna klass. parseint() är en klassmetod (eller statisk metod). En klassmetod är (som du förhoppningsvis minns) en metod som kan användas "direkt" - utan att man behöver skapa ett objekt. Vid anropet skriver man helt enkelt klassens namn, en punkt samt metodnamnet. Alltså: x = Integer.parseInt(tf1.getText() ); Klassen Integer finns i paketet java.lang, som ju importeras automatiskt. När x och y är inlästa beräknas summan, summa, och skrivs ut i en etikett med satsen lbl2.settext("summan är " + summa ); Om man konkatenerar (sammanfogar) en sträng med ett tal på detta sätt så blir resultatet en sträng. Om variabeln summa har värdet 375 så kommer strängen Summan är 375 att skrivas ut. Hur gör man om ett tal till en sträng? Nu vet du hur man gör om en sträng till ett tal. Tvärtom då? Hur gör man om ett tal till en sträng? Vi har redan sett att vi får en sträng om vi konkatenerar en sträng med ett tal. I exemplet ovan: "Summan är " + summa blir en sträng. Man gör om ett tal till en sträng helt enkel genom att sammanfoga talet med en tom sträng! (En tom sträng är två citationstecken utan något däremellan) Exempel: Låt x vara ett (hel- eller flyt-)tal. Motsvarande sträng är x +""

Kap 4 : Sid 16 Aritmetik Aritmetiska operatorer Antag att x, y och z är heltalsvariabler (int) och att x = 14 och y = 3 Räkneoperation Operator Java-sats z får värdet Benämning Addition + z = x + y; 17 summa Subtraktion - z = x - y; 11 differens Multiplikation * z = x * y; 42 produkt Division / z = x / y; 4 kvot Modulus (se nedan) % z = x % y; 2 rest Heltalsdivision ger 14 3 = 4 2 3 Rest Kvot Modulus ger resten vid en heltalsdivision Antag nu att x, y och z är flyttalsvariabler (double) och att x = 14.0 och y = 3.0 Räkneoperation Tecken Java-sats z får värdet Addition + z = x + y; 17.0 Subtraktion - z = x - y; 11.0 Multiplikation * z = x * y; 42.0 Division / z = x / y; 4.6666666 (Modulus används ej) Parenteser användas så som i matematiken. Exempel: z = (x + y) * 5 ; Övning: Mata in tal - fortsättning Komplettera klassen InmataTal så att, utöver x, y och summa, även heltalsvariablerna diff, produkt, kvot och rest deklareras. Gör så att de inmatade talens summa, differens, produkt, kvot och rest beräknas och visas då du trycker på knappen. Övning: Räkna med bråk I projektet Kap04, skapa klassen RaknaMedBrak Skriv ett program där man kan skriva in nämnare och täljare i textinmatningsfält. När man trycker på knappen ska bråket visas på blandad form. Lite hjälp: Metoden settext() ska ha en String som argument. Som vi såg på föregående sida så omvandlas ett tal till en sträng helt enkelt genom att sammanfoga talet med en sträng, som kan vara tom. Exempel: Om vi vill att talet x ska visas i en etikett vid namn label1 så skriver vi: label1.settext( +x);

Kap 4 : Sid 17 Typomvandling - cast Exempel 1 Antag att du deklarerat följande: int i = 7; double d = i; Normalt måste variabeln som tar emot ett värde vara av samma datatyp som värdet. Dock kan en flyttalsvariabel ta emot ett heltal. (Ett flyttal rymmer mycket mer information än ett heltal) Flyttalet d ovan kommer att få värdet 7.0 Antag nu att du deklarerat följande: double d = 26.87; int i = d; // Fungerar inte! Heltalet i kan inte ta emot ett flyttal. (Ett flyttal rymmer mycket mer information än ett heltal). Hur ska vi göra? I Java kan man få en tillfällig kopia, med annan datatyp, av en variabel: double d = 26.87; int i = (int) d; (int) d är en heltalskopia av flyttalet d. Eftersom heltal inte kan hantera decimaler sker en avhuggning till heltal. i kommer alltså att få värdet 26 Detta förfarande, att arbeta med en tillfällig kopia med annan datatyp, kallas för att man gör en cast Exempel 2 I kassen InmataTal ovan arbetar vi med två heltal, x och y Vi utför en heltalsdivision och bestämmer kvoten med satsen kvot = x / y; Om x = 13 och y = 3 blir kvoten 4 eftersom 13/3 = 4 1/3 Antag nu att vi vill utföra beräkningen x/y för att få ett decimaltal. Ett sätt är att först lagra heltalsvärdet x i en flyttalsvariabel och sedan utföra divisionen. Det är elegantare att utföra operationen med hjälp av en cast: Heltalsvariabeln är alltså x Om vi skriver (double)x så skapas en tillfällig flyttalskopia av heltalsvariabeln x Satsen dec_kvot = (double)x / y ; (där dec_kvot är en flyttalsvariabel) ger då dec_kvot värdet 4.3333333 Måste man inte skriva satsen så här: dec_kvot = (double)x /(double) y ;? Svaret är nej: Så snart ett uttryck innehåller ett tal eller en variabel av flyttalstyp så får hela uttrycket flyttalstyp. Övning: Mata in tal fortsättning 2 I programmet InmataTal: Deklarera flyttals- (double-)variabeln dec_kvot Låt dec_kvot tilldelas enligt ovan, och tillse att värdet på dec_kvot skrivs ut Exempel 3 Varje tecken (bokstäver och andra tecken) har en motsvarande talkod. Kanske har du hört talas om ascii -kod. Java använder en kod som heter unicode, som är lika med ascii-kod för de flesta tecken som vi använder. Antag att vi har en teckenvariabel tkn som tilldelats ett värde (alltså ett tecken). Då kan vi se unicode för tecknet med satsen System.out.println( (int) tkn ); Antag att vi har en heltalsvariabel a som tilldelats ett värde (alltså ett heltal). Då kan vi se vilket tecken som har det inmatade talet som unicode med satsen System.out.println( (char) a ); (Du kan läsa mer om unicode på JavaJavisst + s hemsida under fliken "Appendix" )

Kap 4 : Sid 18 Omvandla en sträng till flyttal Omvandling från sträng till heltal sker, som du nu vet, med metoden Integer.parseInt(sträng). Motsvarande omvandling från en sträng till ett flyttal sker med metoden Double.parseDouble(sträng). Strängen ska bestå av siffror, eventuellt ett decimaltecken (en punkt) och eventuellt ett minustecken, annars genereras ett fel. (Vi ska snart se hur man tar hand om ett sådana fel.) Double är en klass och parsedouble() är en metod i denna klass. parsedouble() är en klassmetod. Klassen Double finns i paketet java.lang, som importeras automatiskt. Antag att vi matat in en sträng, till exempel "35.678" i ett textfält, tf1. Antag vidare att x är en double-variabel. Variabeln x tilldelas då värdet (talet) 35.678 med satsen x = Double.parseDouble( tf1.gettext() ); Klassen Math I Java finns en klass vid namn Math. I denna finns ett antal matematiska funktioner. De är static-deklarerade (dvs. klassfunktioner) så de anropas med notationen klassnamn.metodnamn(). Funktionen för "kvadratroten ur" heter Math.sqrt() Tilldelningen y = x skrivs med javasyntax y = Math.sqrt( x ) ; Klassen Math innehåller också några konstanter (static final - deklarererade variabler). Konstanten π skrivs Math.PI. Två välbekanta formler uttryckat i Java: omkrets = 2 * Math.PI * radie; area = Math.PI * radie * radie; Klassen Math finns i paketet java.lang, som importeras automatiskt I kapitel 8 finns en översikt med metoderna i klassen Math. Övning: Cirkeln I projektet Kap04, skriv programmet Cirkeln Man ska kunna mata in en radie (ett decimaltal) i ett JTextField och trycka på en JButton. Då ska cirkelns area och omkrets beräknas och skrivas ut i JLabels. (Lösningsförslag finns på nästa sida) Övning: Pythagoras' sats I projektet Kap04, skriv programmet Pythagoras. Man ska kunna mata in de båda kateternas längder. Programmet ska beräkna och skriva ut hypotenusans längd. katet2 hypotenusa hypotenusa = katet1*katet1 + katet2*katet2 katet1

Kap 4 : Sid 19 Lösningsförslag "Cirkeln" import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Cirkeln extends JFrame implements ActionListener{ JButton butt; JTextField tf; JLabel lbl_ledtext, lbl_area, lbl_omkrets; double radie, area, omkrets ; public Cirkeln() { this.setlayout(new FlowLayout()); butt = new JButton("OK"); lbl_ledtext=new JLabel("Ange radie"); tf = new JTextField(10); lbl_area= new JLabel(); lbl_omkrets= new JLabel(); add(lbl_ledtext); add(tf); add(butt); butt.addactionlistener(this); tf.addactionlistener(this); add(lbl_area); add(lbl_omkrets); public void actionperformed(actionevent e){ radie = Double.parseDouble(tf.getText()); area = radie*radie*math.pi; omkrets = 2 * Math.PI * radie; lbl_area.settext("area: " + area); lbl_omkrets.settext("omkrets: " + omkrets); public static void main(string[] args) { Cirkeln f = new Cirkeln (); f.setsize(200, 200); f.setlocation(100,100); f.settitle("cirkeln"); f.setdefaultcloseoperation(exit_on_close); f.setvisible(true);

Kap 4 : Sid 20 Felhantering (Undantagshantering) Övning: try - catch Kör programmet InmataTal igen. Denna gång: Mata av misstag in bokstäver i stället för siffror i inmatningsrutorna och tryck på knappen. I Eclipse's Console-fönster anmäls då ett fel ett exception har inträffat. Integer.parseInt()-metoden klarar förstås inte att översätta bokstäver till ett tal I Java kan man fånga upp sådana här fel ( = onormala händelser = undantag = exceptions ) Det sker med hjälp av en så kallad try - catch - konstruktion. Ändra i koden. Bädda in tilldelnings- och beräkningssatserna i ett try-block, så här: try{ x = Integer.parseInt( tf1.gettext() ); y = Integer.parseInt( tf2.gettext() ); summa = x + y; lbl2.settext("summan är " + summa ); catch(exception exc){ Provkör dels med siffror i inmatningsrutorna, dels med bokstäver i åtminstone den ena rutan. Om allt fungerar i try-blocket så är det frid och fröjd. Om något går galet i try-blocket så tas felet om hand (inget meddelande i DOS-fönstert), och det som står i catch-blocket utförs. (För närvarande är catch-blocket tomt) Låt oss göra så att ett felmeddelande skrivs ut om vi matar in något som inte är siffror. Lägg in kod i catch-blocket: catch(exception exc) { summa = 0; lbl2.settext("felaktig inmatning" ); Provkör igen! Dels med siffror i inmatningsrutorna, dels med bokstäver i åtminstone den ena rutan. Övning: Felhantering Förse programmen Cirkeln och Pythagoras med felhantering.

Kap 4 : Sid 21 Avrundning Avrundning med metoden String.format() Antag att area är ett flyttal och att vi skriver ut variabelvärdet med denna sats: lbl2.settext("arean är " + area ); I utskriften får vi med ett stort antal decimaler. Ofta vill vi begränsa antalet decimaler i utskrift av flyttal. Vi kan då använda en funktion i String-klassen som heter format. Vi ändrar ovanstående sats till lbl2.settext( String.format("Arean är %5.3f", area) ); Funktionen String.format() har som första argument en sträng, nämligen den text som ska skrivas ut, i vårt fall: "Arean är %5.3f". I strängen finns en kod som inleds med ett procenttecken: %5.3f Koden betyder att på denna plats i strängen ska det skrivas ut ett flyttal (f:et står för flyttal) för vilket reserveras (minst) 5 teckenpositioner och talet ska skrivas med 3 decimaler. Vilket tal ska då skrivas ut? Jo, värdet hos den variabel som står som andra argument, alltså i vårt fall area. Ett exempel till: Antag att x är ett flyttal och i är ett heltal och att vi skriver ut variabelvärdena med satsen lbl2.settext( String.format("x = %6.2f och i = %4d", x, i) ); Om x (exempelvis) har värdet 45.6789 och i (exempelvis) har värdet 13 så blir utskriften: x = 45,68 och i = 13 6 pos 4 pos Den första koden, %6.2f, gör att den först uppräknade variabeln, x,som är ett flyttal (f), skrivs ut på (minst) 6 teckenpositioner med 2 decimaler. Nästa kod, %4d, gör att nästa variabel, i, som är ett heltal (anges med d i koden) skrivs ut på (minst) 4 teckenpositioner. Avrundning med metoden format() i klassen DecimalFormat Här är ett alternativt sätt att avrunda: Man skapar objekt ur en klass vid namn DecimalFormat. Exempel: DecimalFormat df2 = new DecimalFormat("0.00"); // ger 2 decimaler DecimalFormat df3 = new DecimalFormat("0.000"); // ger 3 decimaler Om vi nu vill skriva ut ett tal, till exempel area, med två decimaler låter vi area vara argument i df2:s metod format(), så här: lbl2.settext("arean är " + df2.format(area) ); Klassen DecimalFormat finns i paket java.text, alltså: import java.text.*; Övning: Avrunda Förse programmen Cirkeln och Pythagoras med lämplig avrundning Anmärkning: Ovanstående metoder kan förstås även användas i konsolmiljö. Exempel: System.out.println( String.format("Arean är %5.3f", area) ); Exempel: System.out.println(("Arean är " + df2.format(area));

Kap 4 : Sid 22 En JPanel Vi ska till sist i detta kapitel stifta bekantskap med ännu en klass, JPanel, och låta ett fönster visa ett JPanelobjekt, en panel. Övning: Testa en JPanel I projektet Kap04, skapa programmet JPanelTest. Skriv in denna kod: import javax.swing.*; import java.awt.*; public class JPanelTest extends JFrame { JPanel p; public JPanelTest() { this.setlayout(new FlowLayout()); p = new JPanel(); p.setbackground(color.red); this.add(p); public static void main(string[] args) { JPanelTest f = new JPanelTest (); f.setsize(220, 200); f.setlocation(100,100); f.settitle("jpaneltest "); f.setdefaultcloseoperation(jpaneltest.exit_on_close); f.setvisible(true); I koden ovan deklarerar vi JPanel-objektet, panelen, med referensen p. I konstruktorn skapas panelen, den ges röd bakgrundsfärg och läggs ut i fönstret med add(p); Spara och provkör! Panelen syns som en liten fyrkant, i mitten, högst upp i fönstret. I konstruktorn, före add()-satsen, lägg till satsen p.setpreferredsize(new Dimension(80,60)); Spara och exekvera igen! Metoden setpreferredsize(), med ett Dimension-objekt som argument, gör att panelen visas med viss storlek. Vår panel får dimensionen 80 x 60 pixlar.

Kap 4 : Sid 23 Något om BorderLayout Vi har i våra övningar försett våra JFrame-objekt med en layout manager, nämligen FlowLayout. En layout manager bestämmer hur komponenter ska placeras ut i fönstret. Med FlowLayout kommer, som bekant, knappar och andra komponenter att placeras ut i tur och ordning centrerade, uppifrån och ned. Vi ska nu testa en annan layout manager, nämligen BorderLayout. Övning: Testa BorderLayout I programmet JPanelTest byt till BorderLayout, det vill säga byt satsen mot satsen this.setlayout(new FlowLayout()); this.setlayout(new BorderLayout()); Spara och provkör! Med BorderLayout fyller panelen upp hela fönstret! Pröva att ändra fönsterstorleken. Panelen fyller fortfarande hela fönstret. En JPanel är, precis som en JFrame, en container. Vi kan lägga ut knappar, textrutor etcetera på den. En JPanel är dessutom lämplig att använda för färger och grafik. I nästa kapitel kommer vi att bygga våra GUI-applikationer enligt den idé som åskådliggjorts här: Själva fönstret är en JFrame. Vi fyller det med en JPanel på vilken vi, i sin tur, placerar komponenter och grafik. Anmärkning 1: Metoden setpreferredsize()har ingen inverkan vid BorderLayout. Anmärkning 2: I vårt exempel ovan ser vi bara en effekt av BorderLayout nämligen den att paneler och komponenter flyter ut till kanterna. Denna layout manager har mer än så att erbjuda. BorderLayout används för att dela in en fönsteryta i flera fält, vilka i sin tur kan innehålla paneler och komponenter. Kapitel 12 handlar om layout. Där kommer vi att se närmare på FlowLayout, BorderLayout och fler möjligheter att påverka applikationens layout.