Komponenter och
layout i Java
• Innehåll
– Grafiska komponenter
– Klassen Container
– Layouthantering
• FlowLayout
• Gridlayout
• BorderLayout
– Klassen Panel
JavaC - 1
Grafiska
användargränssnitt
JavaC - 2
• I Java byggs det grafiska användargränssnittet upp med hjälpmedel för bl.a :
– Grafiska komponenter
• Presenterar ett användargränssnitt
med knappar, fönster, listboxar etc
– Layouthantering
• Organiserar och placerar ut
komponenter på lämpligt sätt i ett
fönster
– Händelsehantering
• Fångar och hanterar händelser som
musklick eller tangentbordsnedtryckningar som användaren
genererar
– Grafik
• Ritar enkla figurer, hanterar bilder
och ljud
1
AWT (Abstract
Window Toolkit)
Grafiska komponenter, JavaC - 4
klasstruktur
JavaC - 3
• I Java API finns ett paket java.awt som som
innehåller en mängd klasser för att utveckla
grafiska användargränssnitt
– AWT är plattformsoberoende men
applikationerna antar den exekverande
plattformens ”look and feel”
• Klasserna i AWT är huvudsakligen organiserade i
en arvshierarki med klassen Component i toppen
– En komponent representerar ett färdigt
gränssnittselement (t.ex en knapp) som kan
presenteras och positioneras
• En container är en speciell komponent i form av
en skärmyta (t.ex Applet eller Frame) på vilken
andra komponenter kan placeras
Panel
Container
ScrollPane
Dialog
Button
Window
FileDialog
Checkbox
Frame
Component
Choice
List
Canvas
Label
• (I JDK 1.2 finns ett nytt paket kallat Swing med
nya klasser för grafiskt användargränssnitt.
Swing innehåller fler komponenter, är säkrare
och har ett mer homogent utseende på olika
plattformar än AWT)
Applet
TextField
TextComponent
Scrollbar
TextArea
2
Några grafiska
komponenter
JavaC - 5
Metoder i klassen
Component
JavaC - 6
• Exempel metoder som är gemensamma och kan
utföras på alla komponeneter:
setBackground(färg)
Sätter bakgrundsfärgen
setForeground(färg)
Sätter förgrundsfärgen
setFont(font)
Sätter typsnitt
Exempel på några klasser för färdiga grafiska komponenter:
Button beskriver en knapp som kan innehålla text
Checkbox beskriver en markeringsruta tillhörande
text som användaren kan markera
Label beskriver en enkel text som kan visas i ett fönster
List beskriver lista med element som visas i en ruta. Om det finns fler
element än vad som får plats i rutan, så finns en bläddringslist (scrollbar).
Choice beskriver en combobox i form av en popup-meny med olika
alternativ. När användaren inte använder menyn visas en ruta med
valda alternativet
Text Field och Text Area beskriver textområden med en
resp flera rader där användaren kan skriva eller läsa text
Scrollbar beskriver en rullningslistdär användaren förändra
ett värde som ligger mellan två givna värden
Canvas beskriver en målarduk på vilken man kan rita godtyckliga
figurer med hjälp av metoder i klassen ”Graphics”
Panel beskriver ett delfönster, används i komplicerade gränssnitt
setSize(x,y)
Sätter komponentens storlek
(Ersätter metoden resize (x, y) i Java 1.0. resize är
numera definierad i klassen Applet)
setVisible(bool)
Visar/gömmer komponenten
repaint()
Ritar om komponenten, anropar paint
paint(g)
Anropas automatiskt då komponenten måste ritas om
3
Placering av
komponenter
JavaC - 7
Klassen Container
• Klassen Container är en superklass till flera
andra klasser bl.a Applet och Frame . Grafiska
komponenter kan inte visas separat på skärmen.
utan måste placeras i en container. (t.ex i ett
fönster av klasserna Applet och Frame)
• Ett objekt w är av en subklass till klassen
Container och kan innehålla komponenter.
Några metoder är:
w.add(x)
JavaC - 8
import java.applet.*;
import java.awt.*;
public class Test extends Applet
{
public void init ()
{
Button knappen = new Button("Knappen");
knappen. setFont (new Font("Serif", Font.ITALIC, 30));
knappen. setBackground (Color.black);
knappen. setForeground (Color. white);
add(knappen);
placerar den grafiska komponenten x i w
Label raden=new Label("En Label",Label.CENTER);
raden. setFont(new Font("monospaced ", Font.BOLD, 40));
raden. setBackground (Color. blue);
raden. setForeground (Color.green);
add(raden);
w.remove(x)
tar bort den grafiska komponenten x i w
}
w.removeAll()
}
tar bort alla grafiska komponent från w
w.setLayout (l)
anger att l skall användas som LayoutManager
w.setVisible(true)
visar w och dess komponenter
4
JavaC - 9
JavaC - 10
Klassen Button
• En knapp kan tryckas ned för att utföra
kommandon eller svara på frågor från
applikationen till användaren. Den skapas
med eller utan text
Klassen Label
En label-komponent visar en enkel rad med text i ett
fönster. Texten kan inte ändras av användaren.
new Label (”text”)
Skapar en Label med texten text vänsterjusterad
new Button()
Skapar en ny knapp utan text
new Button(”text”)
Skapar en ny knapp med texten text på
new Label (”text”, adj)
Skapar en Label med texten text.
adj kan vara Label.LEFT, Label.CENTER
eller Label.RIGHT
l.setText( ”text”)
b.setLabel (”text”)
Placerar texten text på knappen b
Sätter texten i l till text
l.getText()
b.getLabel ()
Returnerar texten på knappen b
Returnerar texten i l
l.setAlignment( adj)
Justerar texten i l. adj kan vara Label.LEFT ,
Label.Center eller Label.RIGHT
l.getAlignment()
Ger Label.LEFT , Label.Center eller
Label.RIGHT
5
Exempel med knapp och
textfält
JavaC - 11
Klassen TextField
Visning av text kan också göras med ett textfält
där användaren kan även kan skriva in text
(s.k. inmatningsfält). När användaren slår Enter
genereras en s.k. ActionEvent
new TextField ()
Skapar ett nytt textfält
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends Applet
{
private TextField texten;
private TextField resultat;
private Button knappen;
new TextField (n)
Skapar ett textfält med plats för n tecken
public void init()
{
knappen = new Button("Knappen");
knappen.addActionListener(new KnappLyssnare());
add(knappen);
new TextField (”text”)
Skapar ett textfält med texten text från början
new TextField (”text”, n)
Skapar ett textfält med texten text från början
och plats med n tecken
texten = new TextField("Skriv något här");
add(texten);
resultat = new TextField(40);
add(resultat);
}
class KnappLyssnare implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
resultat.setText(texten.getText());
}
}
x.setText(”text”)
Placerar texten text i textfältet x
x.getText()
Returnerar texten i textfältet x
JavaC - 12
}
6
Klasserna Choice och
List
JavaC - 13
Choice beskriver en combobox i form av en popup-meny
med olika alternativ. Endast det valda alternativet visas
List beskriver en meny med flera alternativ som visas i
en lista. Listan är bläddringsbar om inte alla alternativ
får plats
new Choice()
Skapar ett ny valmeny
Exempel med knapp,
popup-meny och label
JavaC - 14
import java. applet.*;
import java. awt.*;
import java. awt.event.*;
public class Test extends Applet
{
private Button knappen;
private Choice menyn;
private Label valet;
public void init ()
{
knappen = new Button ("Knappen");
knappen. addActionListener (new KnappLyssnare ());
add (knappen);
new List(n, bool)
Skapar en alternativlista med n synliga alternativ,
om bool == true får flera alternativ väljas
x.add(”text”)
Lägger till alternativet text till x
menyn = new Choice();
menyn.add("Te");
menyn.add("Kaffe");
add(menyn);
x.select(n)
Markerar alternativ n
valet = new Label("Här kommer ditt val att visas.");
add (valet);
x.getSelectedIndex()
Ger numret för markerat alternativ, eller -1 om
inget eller flera alternativ är markerade
}
x.getSelectedItem ()
Ger texten i det valda alternativet
class KnappLyssnare implements ActionListener {
public void actionPerformed (ActionEvent event ) {
valet. setText("Dryck: " + menyn.getSelectedIndex());
}
}
x.getItemCount()
Ger antalet alternativ
}
7
Markeringsrutor och
radioknappar
JavaC - 15
Checkbox beskriver en markeringsruta, med tillhörande
text, som användaren markerar att vara ”på” eller ”av”.
new Checkbox(”text”)
Skapar en checkbox, med texten text och och omarkerad
Exempel med knapp,
radioknappsgrupp och label
JavaC - 16
public class Test extends Applet
{
private Button knappen;
private CheckboxGroup drycker;
private Checkbox te, kaffe;
private Label valet;
new Checkbox(”text”, bool )
Skapar en checkbox, med texten text och markerad om bool är true
public void init ()
{
knappen = new Button ("Knappen");
knappen. addActionListener (new KnappLyssnare ());
add (knappen);
I en radioknappsgrupp är endast en radioknapp markerad
new CheckboxGroup ()
Skapar en radioknappsgrupp
drycker = new CheckboxGroup ();
new Checkbox(”text”, bool , g)
Skapar en radioknapp i gruppen g, med text och eventuellt markerad
te = new Checkbox("Te", true, drycker);
add(te);
x.setState (bool)
Markerar eller avmarkerar x
kaffe = new Checkbox("Kaffe", false, drycker);
add(kaffe);
x.getState ()
Ger true om x är markerad
valet = new Label("Här kommer ditt val att visas.");
add(valet);
x.setCheckboxGroup(g)
Anger att x skall tillhöra gruppen g
}
x.getCheckboxGroup()
Ger den grupp x tillhör
class KnappLyssnare implements ActionListener {
public void actionPerformed (ActionEvent event ){
Checkbox valt = drycker. getSelectedCheckbox ();
valet. setText("DRYCK: " + valt. getLabel ());
}
}
g.setSelectedCheckbox(x)
Anger att x i gruppen g skall markeras
g.getSelectedCheckbox(x)
Ger den Checkbox i gruppen g som är markerad
}
8
JavaC - 17
Layouthanterare
•
Layouthanterare är objekt som styr utplaceringen av
komponenter
•
Några vanliga typer av layouthanterare är:
– FlowLayout
Placerar komponenter radvis från vänster till höger, tills
att utymmet är slut, på liknande sätt som texten i en
boksida,. De enskilda komponenterans storlek förändras
ej.
– GridLayout
Fönstret delas upp i ett rutnät med rader och kolumner.
Komponenterna placeras ut radvis från vänster till höger.
Alla komponenter blir lika stora.
– BorderLayout
Fönstret delas in i fem områden. Fyra områden längs
fönstrets fyra kanter och ett femte område i fönstrets
mitt.
JavaC - 18
FlowLayout
• FlowLayout är default LayoutManager för
klasserna Applet och Panel.
• FlowLayout-placeringen ändras automatiskt om
fönstrets storlek ändras
• Konstruktorer:
new FlowLayout ()
Komponenterna centreras
new FlowLayout (a)
a är FlowLayout .LEFT eller FlowLayout .RIGHT
new FlowLayout (a, dx, dy)
dx och dy anger avstånd mellan komponenterna
– CardLayout
CardLayout skiljer sig från andra layouthanterare genom
att alla komponenter inte syns på en gång. Man definierar
istället en ”kortlek” som användaren kan bläddra i och
studera ett i taget (jmfr flikar)
– GridBagLayout
Delar in fönstret ett rutnät med olika stora rutor. Vissa
komponenter kan dessutom uppta flera rutor
9
JavaC - 19
Applet med FlowLayout
import java. applet.*;
import java. awt.*;
public class Test extends Applet
{
private Button b1 = new Button ("1");
private Button b2 = new Button ("Knapp 2");
private Label l3 = new Label ("Label 3");
private TextField t4 = new TextField ("Text 4");
private Canvas c5 = new Canvas ();
// Canvas är en komponent som endast tillhandahåller
// en yta att rita på, t.ex grafiska figurer
public void init ()
{
c5. setBackground (Color.lightGray );
c5. setSize(75,75); //måste anges
setLayout(new FlowLayout());
add (b1); add(b2); add(l3); add(t4); add(c5);
GridLayout
JavaC - 20
• Fönstret delas in i ett rutnät. Alla komponenter
blir lika stora även om man angivit något annat
• Konstruktorer
new GridLayout (r,k)
Placerar komponenterna i r rader och k kolumner.
0 betyder godtyckligt antal rader respektive
kolumner
new GridLayout (r, k, dx, dy)
dx och dy anger avstånd mellan komponenterna
• Antalet kolumner justeras om antalet
komponeneter som placeras inte stämmer
}
}
10
JavaC - 21
Applet med GridLayout
import java. applet.*;
import java. awt.*;
BorderLayout
JavaC - 22
• Konstruktorer
new BorderLayout ()
public class Test extends Applet
{
private Button b1 = new Button ("1");
private Button b2 = new Button ("Knapp 2");
private Label l3 = new Label ("Label 3");
private TextField t4 = new TextField ("Text 4");
private Canvas c5 = new Canvas ();
private Button b6 = new Button ("6");
public void init ()
{
c5. setBackground (Color. lightGray );
c5. setSize (75,75);
setLayout(new GridLayout(2,3));
Delar upp fönstret i fem områden. Fyra områden längs
fönstret kanter och ett område i fönstrets centrum
new BorderLayout (dx, dy)
dx och dy anger avstånd mellan komponenterna
• Metoder
add(”plats”, c)
Placerar ut komponenten c. plats kan vara North,
South, East, West eller Center
add (b1); add(b2); add(l3); add(t4); add(c5); add(b6);
}
}
11
Applet med
BorderLayout
Olika layouthanterare
med klassen Panel, del 1
JavaC - 23
•
import java. applet.*;
import java. awt.*;
public class Test extends Applet
{
private Button b1 = new Button ("1");
private Button b2 = new Button ("Knapp 2");
private Label l3 = new Label("Label 3");
private TextField t4 = new TextField("Text 4");
private Canvas c5 = new Canvas();
public void init()
{
c5.setBackground(Color.lightGray);
c5.setSize(75,75);
setLayout(new BorderLayout());
add("West", b1); add("East", b2); add("North",l3);
add("South", t4); add("Center", c5);
}
•
•
JavaC - 24
Klassen Panel är en generell containerklass som används för
att innehålla ett antal komponenter i mer komplicerade
gränssnitt.
Paneler används och placeras normalt inuti en annan container.
– En container kan exempelvis innehålla två paneler, där en
panel använder en typ av layout manager och den andra
har en annan typ.
I exemplet nedan används tre paneler, där appleten använder
en typ av layout manager och panelerna en annan typ.
import java. applet.*;
import java. awt.*;
public class Test extends Applet
{
public void init()
{
Panel knappar = new Panel();
knappar.setLayout(new FlowLayout(FlowLayout.RIGHT));
knappar.add(new Button("OK"));
knappar.add(new Button("Cancel"));
knappar.add(new Button("Help"));
}
Panel input = new Panel();
input.setLayout(new GridLayout(3,1));
Panel rad1 = new Panel();
rad1.setLayout(new FlowLayout(FlowLayout.RIGHT));
rad1.add(new Label("Namn:", Label.RIGHT));
rad1.add(new TextField(40));
input.add(rad1);
12
Olika layouthanterare
med klassen Panel, del 2
JavaC - 25
Panel rad2 = new Panel();
rad2. setLayout (new FlowLayout (FlowLayout .RIGHT));
rad2. add(new Label ("Adress:", Label.RIGHT));
rad2. add(new TextField (40));
input. add(rad2);
Panel rad3 = new Panel();
rad3. setLayout (new FlowLayout (FlowLayout .RIGHT));
rad3. add(new Label ("Telefonnummer:", Label.RIGHT));
rad3. add(new TextField (40));
input.add(rad3);
setLayout(new BorderLayout());
add("North", knappar);
add("Center", input);
}
}
13