1
Grafiska komponenter
Vi har sett exempel på hur vi kan arbeta med enkla dialogrutor med klasser JOptionPane och
hur vi kan rita med en rityta, Graphics instans, i en Java applet. Att skapa ett grafiskt
gränssnitt är däremot en helt annan sak. Att skapa ett bra grafiskt gränssnitt kräver planering,
kunskap och god erfarenhet av gränssnitt. Under denna kurs kommer vi att titta på några
enklare exempelfall utan att fördjupa oss nämnvärt i utformningen av grafiska gränssnitt.
Vi kommer heller inte fördjupa oss i de grafiska komponenternas ganska sammansatta
uppbyggnad, utan till stor del förlita oss på NetBeans grafiska editor. I vissa tillfällen blir det
emellertid nödvändigt att fördjupa oss i de grafiska komponenternas detaljer.
Vårt mål är att skapa en helt grafisk applikation i form av en text editor
För att applikationen ska vara någorlunda användbar vill vi kunna Skapa, Öppna och Spara
filer.
För att kunna göra det behöver vi känna till en hel del handhavande i NetBeansmiljön. Det är
inte vår avsikt att själva skriva programkod för att skapa utseendet på applikationen, det låter
vi NetBeans göra åt oss.
1.1
Förberedelser:
Att skapa en grafisk applikation innebär att vi skapar ett projekt på vanligt sätt, men istället
för att låta miljön skapa en Main-klass åt oss, kommer vi att skapa den i ett senare steg.
Avmarkera därför alternativet "Create Main Class", se bild. Miljön skapar nu endast
projektmappar för projektet.
Då projektmapparna är skapade vänder vi oss till projektmappen "Source Packages" och
skapar ett paket döpt exempelvis myfirstguiapp. Högerklicka välj New / Java package.
Då paketet myfirstguiapp skapats skapar vi ett JFrame Form. Högerklicka på paketnamnet
välj New / JFrame Form, döp formulärklassen till MyFrame. Detta kommer att aktivera den
grafiska editor som används för att skapa utseendet på applikationen.
Om du därefter utvecklar (clicka på plussymbolen efter filnamnet MyFrame.java ) innehållet i
den skapade javafilen ser du två delar, istället för en som tidigare. Den ena är kopplad till
programkoden, den andra till formuläret och den grafiska editorn.
1.2
Centrala klasser
JFrame -
en instans av typen JFrame är själva applikationsfönstret. Det fönster som ovan har titel "Java
text editor" och knapparna för minimera, maximera och stäng fönster. En JFrames viktigaste
egenskap är att den är en Container, behållare, för andra komponenter. Då vi vill lägga in
knappar, textrutor, rullningslister och andra grafiska komponenter använder vi
JFrameinstansens behållare, kallad ContentPane, för att lägga till komponenterna. En
Container/behållare har också en Layout, en utplaceringsstrategi för dess komponenter, mer
om det senare.
JToolBar -
en instans av typen JToolBar representerar en flyttbar knapplist, såsom den som ovan
innehåller knapparna New, Open och Save. Knapplisten har en utgångsposition som vi måste
ange, men därefter är den flyttbar och dockningsbar. Den kan alltså dels flyttas fritt som ett
fönster på skärmen, men också dockas till kanterna på ett applikationsfönster. En JToolBar är
också en behållare, i synnerhet en Container/behållare för knappar, instanser av typen
JButton.
JButton -
en JButton är en knapp som användaren kan klicka på. En knapp kan bestå av en bild (jpg, gif
el. png format) eller text, eller en kombination av de båda. En knapp placeras alltid in i en
behållare, gärna med hjälp av det grafiska formgivningsverktyget. Då en knapp
aktiveras/klickas av en användare kommer den att skapa ett Event/händelse. Hur man hanterar
händelser är målet för nästa föreläsning.
JTextPane -
en JTextPane är en komponent som innehåller text, och även låter användaren redigera texten
om så önskas. Man kan ställa in typsnitt, textstorlek och många andra egenskaper i en
JTextPane.
JScrollPane -
en JScrollPane har inget självändamål, utan finns som stöd till andra komponenter som
behöver använda sig av en stor yta. En JScrollPane är alltså även den en behållare.
Typexempel på stora komponenter är just flerradiga textkomponenter såsom JTextPane och
tabeller, JTable. Vi kommer inte att behandla JTable, eftersom den är en kraftfull, men
komplicerad komponent. Om du önskar tips så hör av dig i forumet, eller sök hjälp på
Internet.
Det finns som du ser i miljön en uppsjö av andra komponenter i swingpaketet. Vi har
ingensomhelst möjlighet att behandla alla, eller ens gå igenom komponenternas struktur
ordentligt. Du kommer däremot märka att alla grafiska komponenter har många egenskaper
gemensamma, så om man lär sig om en komponent, kommer det till godo då man skapar nästa
komponent.
JFileChooser -
en JFileChooser är en komponent som representerar en standarddialogruta, antingen en Save
File.. dialog eller en Open File... dialog. Den är ytterligt lättanvänd, man behöver bara ange
om man ska skapa dialogfönstret i läget Open eller Save.
Bilderna är hämtade från en grafisk presentation av samtliga swingkomponenter som du hittar
på http://java.sun.com/docs/books/tutorial/uiswing/components/components_pics.html
1.3
Handhavande NetBeans
Läs igenom detta avsnitt en första gång, gå därefter till videopresentationen som illustrerar
handhavandet i NetBeans.
Detta är vyn som visas efter att ett JForm-formulär skapats (något modifierad, MyFrame.java u.v. är
utvecklad, och Inspector [JFrame] n.v. är utvecklad). Det är viktigt att påpeka att det grafiska
gränssnitt som skapas i editorn, Form MyFrame, får direkta konsekvenser för programkoden i klassen
MyFrame. Till skillnad från många andra grafiska editorer av den här typen så kan man alltså gå till
programkoden i MyFrame.java och se vilka programsatser som varje komponent ger upphov till. Gör
gärna det; Det är inte viktigt att helt förstå hur den skapade programkoden är uppbyggd, men man får
en god överblick över vad som händer då gränssnittet skapas.
Alla delar i vyn har en speciell uppgift då vi skapar ett grafiskt gränssnitt.
Projektmappen - projektmappen visar beståndsdelarna i klassen MyFrame och i formuläret (en lista
med komponenterna som är lagda till formuläret). Den är användbar för att växla vy mellan
Formulärets java-fil (programkoden) och Det grafiska redigeringsläget.
Inspector - inspectorfältet är där vi lägger till och redigerar komponenter. I synnerhet kan vi här välja
meningsfulla namn på våra komponenter. Det är viktigt att ge alla komponenter ett namn som
illustrerar dess syfte. Om vi exempelvis betraktar de tre knappar som skapats för "Java text editor",
New, Open och Save, döps dessa med fördel till newButton, openButton resp. saveButton. Det ger oss
sedan möjligheten att i vår javakod ändra/läsa av tillståndet hos knapparna på ett enkelt, eller
åtminstone lättläst sätt.
Under delen "Other Components" lägger vi till de komponenter som inte ska vara direkt synliga i vårt
applikationsfönster. Exempelvis Open dialogrutan som ska visas då man tryckt på knappen
openButton är inte direkt synlig i applikationsfönstret.
Palette - palettfältet visar en lista på samtliga swingkomponenter vi kan tänkas vilja använda i
applikationen. För att lägga till en komponent till applikationen markerar vi komponenten i paletten
och klickar i applikationfönstret, för att ange var komponenten ska placeras ut. Vi har nämnt
utplaceringsstrategi/Layout tidigare. Komponenten kommer sannolikt inte utplaceras exakt där vi
klickar i applikationsfönstret med musen, utan tar det som en ledning, layouten kommer att avgöra
exakt var komponenten till slut hamnar. Mer om de olika layouttyperna senare; vi kan i förbifarten
notera att under Inspector står det BorderLayout.
Properties - propertiesfältet är troligtvis det fält som vi kommer att vara mest aktiva i. I
propertiesfältet ser vi samtliga egenskaper som är aktuella för den aktiva komponenten. I startläget i
bilden ovan ser vi att egenskaperna för vår JFrame, applikationsfönstret, visas. Bland annat kan vi
ange en text som ska visas i applikationsfönstrets titelrad, title. Det är nyttigt att för varje ny
komponent titta igenom listan med properties för att bilda sig en uppfattning om hur komponenten kan
användas.
1.4
Layouter
Som nämnts tidigare kan varje Container ha en egen utplaceringsstrategi, Layout Manager, av
komponenterna den innehåller. Det finns i java ungefär tio olika layouthanterare, de viktigaste är
FlowLayout, BorderLayout, BoxLayout och GridLayout.
FlowLayout placerar ut komponenterna från vänster till höger med den storlek som komponenten
själv ber om. Om raden tar slut börjar den på nästa rad från vänster. Knapparna i toolbarkomponenten
är utplacerade med FlowLayout.
BorderLayout placerar ut komponenter i riktningarna NORTH, EAST, WEST, SOUTH och
CENTER. CENTER är som regel den största ytan, och utgör ytan som inte ockuperas av de andra
riktningarna.
JFramekomponenten i "Java text editor" använder BorderLayout, med toolbarkomponenten i
BorderLayout.NORTH och JTextField i BordeLayout.CENTER. Komponenterna i en BorderLayout
får som regel inte sin önskade storlek, Komponenterna i EAST och WEST får sin önskade bredd, men
höjden ges av det tillgängliga utrymmet, ofta högre än komponentens rätta storlek. NORTH och
SOUTH ger komponenten dess rätta höjd, men bredden ges av bredden på vår JFrame, eller
föräldrakomponenten/behållaren. CENTER får det resterande utrymmet.
BoxLayout placerar komponenterna i antingen horisonell led eller vertikal led, och försöker samtidigt
ge komponenterna dess rätta storlek. Etiketter med tillhörande textfält kan orienteras med BoxLayout.
GridLayout tvingar in komponenterna i en tabellstruktur med ett visst antal rader, eller ett visst antal
kolumner. En GridLayout som innehåller 7 komponenter i 2 kolumner ges 4 rader. En GridLayout
som innehåller 7 komponenter i 3 rader ges 3 kolumner. Alla komponenter i layouten får samma
storlek. Kapparna i en miniräkareapplikation kan tänkas placeras in i en GridLayout.
En någorlunda sammansatt grafiskt gränssnitt kommer att bestå av många behållare, Containers, och
varje behållare kommer att ha en egen LayoutManager.