Grafiska program i
Java
•
Programmeringsgränssnittet för grafik i Java : Java
Graphics API innehåller en mängd klasser för att
utveckla grafiska program. De viktigaste typerna av
klasser är:
– Komponenter för användargränssnitt- beskriver
fönster, knappar, textfält etc (kap. 9)
– Layouthantering - organiserar och placerar ut
gränssnittskomponenter på lämpligt sätt i ett
fönster
– Händelsehantering - fångar och hanterar
händelser, t.ex. musklick eller tangentnedtryckningar, som användaren initierar
– Grafik – ritverktyg med hjälpmedel för färger och
typsnitt, etc,
•
8 -2
8 -1
Innehåll:
– Java Graphics API
• AWT och Swing
• Frame-fönster
– Layouthanterare
• FlowLayout, GridLayout, BorderLayout
• Paneler
– Grafik
• Klasserna Graphics, Color och Font
• Metoder för ritning
– Händelsehantering
• Händelseklasser, lyssnare och lyssnarmetoder
AWT och Swing?
• Java Graphics API erbjuder två besläktade gränssnitt för att
utveckla grafiska användargränssnitt. Bägge verktygen är
plattformsoberoende och applikationerna antar den
exekverande plattformens ”look and feel”
• AWT (Abstract Windowing Toolkit, java.awt)
– Många gränssnittsklasser i AWT använder en motsvarande s.k.
peer-klass för att ritas ut på en viss plattform. Denna bygger
på s.k. ”native” kod. Utseendet blir härigenom delvis beroende
av plattformen.
• Swing (java.swing)
– Ett nyare paket (fr. o. m JDK 1.2 ). Rekommenderas av de som
utvecklar Java. Bygger på och använder även klasser i AWT.
– Har utökad funktionalitet med fler och mer avancerade
komponenter. Utnyttjar plattformens kapacitet bättre.
– Använder s.k. lättviktskomponenter (utan peer-klasser) skrivna
helt i Java och får därför ett mer homogent utseende på olika
plattformar än AWT.
– Swing - ingår i JFC (Java Foundation Classes)
AWT
Swing
Button
JButton
• Swing-komponenter har i allmänhet ett J i början på namnet
• Man bör undvika att blanda AWT och Swing-komponenter
8 -4
8 -3
Klassen JFrame
Java Graphics API
•
Java Graphics API är ett utmärkt exempel på användning av klasser,
arv och gränssnitt. Det består av två paket som innehåller bl.a följande
klasser:
•
java.awt:
•
•
•
•
•
Component - superklass till alla klasser för användargränssnitt.
Definierar många och viktiga egenskaper för alla komponenter.
Container - grupperar gränssnittskomponenter. Frame, Applet och
Panel är exempel på containrar som innehåller AWT-komponenter
– LayoutManager – är ett gränssnitt i Java som används av en
container för att positionera och placera komponenter på önskad
plats i en container
AWTEvent med sina subklasser - representerar händelser som
komponenterna skapar
Font, FontMetrics och Color – är hjälpklasser för att ange färg och
typsnitt på grafiska komponenter
Graphics - används för att rita text, linjer och figurer
•
•
JFrame
Titelrad
javax.swing:
•
•
Content pane
JComponent - superklass till alla lättvikts-swingkomponenter, som t.ex.
JButton JTextField m.m.
JFrame och JApplet - fönster där swingkomponenter placeras
AWTEvent
Font
LayoutManager
Classes in the java.awt
package
1
Gränssnittskomponenter kan inte visas direkt på
skärmen utan måste placeras på en skärmyta som ingår
i något fönster. Skärmytan är en s.k. container (t.ex en
Frame eller en Applet).
Klassen Frame beskriver ett fristående fönster som
används i applikationer med AWT-komponenter
Klassen JFrame är grunden för att skapa en grafisk
applikation med Swing-komponenter. Ett JFramefönster består av en titelrad och en content pane där
komponenter placeras.
Komponent
Heavyweight
FontMetrics
Object
Color
Panel
Applet
JApplet
Window
Frame
JFrame
Dialog
JDialog
•
Graphics
Component
Container
*
Swing Components
in the javax.swing package
JComponent
Lightweight
En Applet är en skärmyta som ingår som en del i
webbläsarens fönster. Applets kommer att
presenteras närmare senare. När en Swingbaserad
Java applet ska skapas ärver man klassen JApplet.
Swing-komponenter i
ett JFrame-fönster
•
•
Skapa ett JFrame-fönster, bygg upp gränssnittet
genom att välja en LayoutManager, samt skapa och
lägga till Swing-komponenter i fönstrets ContentPane
Swing använder paketen javax.swing och java.awt
import javax.swing.*;
import java.awt.*;
class DemoInmatning extends JFrame{
DemoInmatning(){
Container con=getContentPane();
con.setLayout(new FlowLayout());
JLabel l=new JLabel("Namn:");
con.add(l);
JTextField tf=new JTextField(12);
con.add(tf);
JButton knapp=new JButton("Skapa");
con.add(knapp);
}
public static void main(String[]args){
DemoInmatning frame = new DemoInmatning();
frame.setTitle("Demo Inmatning");
frame.setSize(300, 75);
frame.setVisible(true);
}
}
AWT-komponenter i
ett Frame-fönster
8 -5
•
•
8 -6
Skapa ett Frame-fönster, bygg upp gränssnittet genom
genom att välja en LayoutManager, samt skapa och
lägga till AWT-komponenter i fönstret
AWT använder paketet java.awt
import java.awt.*;
class DemoInmatning extends Frame{
DemoInmatning(){
setLayout(new FlowLayout());
Label l=new Label("Namn:");
add(l);
TextField tf=new TextField(12);
add(tf);
Button knapp=new Button("Skapa");
add(knapp);
}
public static void main(String[]args){
DemoInmatning frame = new DemoInmatning();
frame.setTitle("Demo Inmatning");
frame.setSize(300, 75);
frame.setVisible(true);
}
}
Exempel med
FlowLayout
8 -7
Layouthanterare
•
En layouthanterare (eng. Layout Manager) är ett objekt i
AWT som styr utplaceringen av komponenter för att anpassa
ett gränssnitt efter skillnader i olika plattformar.
•
Varje container har en layouthanterare. Så här definieras en
layouthanterare av typen FlowLayout för en container:
con.setLayout(new FlowLayout());
•
Några vanliga typer av layouthanterare är:
– FlowLayout
Ordnar komponenter radvis från vänster till höger, tills
att raden har fyllts, på liknande sätt som texten i en
boksida,. Komponenternas ursprungliga storlek behålls vid
utplaceringen.
– GridLayout
Fönstret delas upp i ett rutnät med rader och kolumner.
Komponenterna ordnas radvis från vänster till höger. Alla
komponenter får samma storlek.
– 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.
– GridBagLayout
Liknar GridLayout men delar in fönstret ett rutnät med
rutor av olika storlek. En komponent kan uppta flera
celler.
– 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)
8 -8
import javax.swing.*;
import java.awt.*;
class FlowLayoutDemo extends JFrame{
FlowLayoutDemo(){
Container con=getContentPane();
con.setLayout(new FlowLayout());
con.setBackground(Color.white);
con.add(new JButton("Knapp 1"));
con.add(new JButton("Knapp 2"));
con.add(new JLabel("Label 3"));
con.add(new JTextField("Text 4"));
}
public static void main(String[]args){
FlowLayoutDemo frame = new FlowLayoutDemo();
frame.setTitle("FlowLayout Demo");
frame.setSize(200, 100);
frame.setVisible(true);
}
}
•
Komponentplaceringen ändras automatiskt om
fönstrets storlek ändras.
8 -9
FlowLayout
Exempel med
GridLayout
8 - 10
• Komponenterna ordnas radvis från vänster till
höger. När en rad fyllts påbörjas nästa rad.
import javax.swing.*;
import java.awt.*;
• Konstruktorer:
class GridLayoutDemo extends JFrame{
GridLayoutDemo(){
Container con=getContentPane();
con.setLayout(new GridLayout(2,3));
con.add(new JButton("Knapp 1"));
con.add(new JButton("Knapp 2"));
con.add(new JTextField("Text 4"));
con.add(new JLabel("Label 3"));
con.add(new JButton("Knapp 5"));
}
public static void main(String[]args){
GridLayoutDemo frame = new GridLayoutDemo();
frame.setTitle("GridLayout Demo");
frame.setSize(300,100);
frame.setVisible(true);
}
}
new FlowLayout(a)
a anger justering på raden och kan vara
FlowLayout.LEFT, FlowLayout.CENTER eller
FlowLayout.RIGHT
new FlowLayout(a, dx, dy)
dx och dy anger avståndet i pixlar mellan
komponenterna
new FlowLayout()
Komponenterna centreras på raden med default
avstånd mellan komponenterna
• FlowLayout är default LayoutManager för
klasserna JApplet och JPanel.
Exempel med
BorderLayout
8 - 11
GridLayout
• Fönstret delas in i ett rutnät med rader och
kolumner. Alla celler rymmer en komponent och
får samma storlek. Komponenterna placeras
radvis i rutnätet från vänster till höger med
början i första raden
8 - 12
import javax.swing.*;
import java.awt.*;
class BorderLayoutDemo extends JFrame{
BorderLayoutDemo(){
Container con=getContentPane();
con.setLayout(new BorderLayout());
• Konstruktorer:
con.add(new JLabel("EAST"), BorderLayout.EAST);
con.add(new JButton("SOUTH"), BorderLayout.SOUTH);
new GridLayout(r,k)
con.add(new JTextField("WEST"), BorderLayout.WEST);
Placerar komponenterna i r rader och k kolumner.
Värdet 0 innebär godtyckligt antal rader respektive
kolumner
con.add(new JButton("NORTH"), BorderLayout.NORTH);
con.add(new JButton("CENTER"), BorderLayout.CENTER);
}
public static void main(String[]args){
BorderLayoutDemo frame = new BorderLayoutDemo();
new GridLayout(r, k, dx, dy)
dx och dy anger avstånd mellan
komponenterna
frame.setTitle("BorderLayout Demo");
frame.setSize(300,200);
frame.setVisible(true);
}
• Antalet kolumner i rutnätet justeras om antalet
komponenter som placeras inte stämmer med
angivna konstruktorvärden
}
8 - 13
BorderLayout
• Delar upp fönstret i fem områden. Fyra områden längs
fönstrets kanter (North, South, East eller West) och
ett område i fönstrets centrum (Center). Områdenas
storlek anpassas efter komponenterna.
• Vissa områden i fönstret kan vara tomma.
• Konstruktorer:
new BorderLayout()
Gruppera komponenter
med paneler
• Klassen Panel är en generell containerklass.
Paneler fungerar som mindre containrar och
används ofta för att gruppera
gränssnittskomponenter.
• Paneler placeras oftast inuti en annan container,
t.ex ett Frame-fönster eller en applet, men kan
även placeras inne i en annan panel.
• En Frame-fönster indelas ofta i flera paneler,
där varje panel har en egen layouthanterare.
new BorderLayout(dx, dy)
dx och dy anger avstånd mellan komponenterna
Frame
• Metoder:
add(c, ”plats”)
Placerar ut komponenten c. plats kan vara
BorderLayout NORTH, SOUTH, EAST, WEST eller
CENTER
• BorderLayout är default LayoutManager för klassen
Window med sina subklasser (JFrame och JDialog).
8 - 14
Panel med
Panel med
Gränssnittskomponenter
Gränssnittskomponenter
Panel med
Panel med
Gränssnittskomponenter
Gränssnittskomponenter
Ritytor – Graphics
Context
8 - 15
Exempel med paneler
import javax.swing.*;
import java.awt.*;
public class PanelerDemo extends JFrame{
PanelerDemo(){
Container con=getContentPane();
con.setLayout(new BorderLayout());
JPanel p1=new JPanel();
p1.setLayout(new FlowLayout());
p1.add(new JButton("Lägg Till"));
p1.add(new JTextField(10));
p1.add(new JButton("Avsluta"));
con.add(p1, BorderLayout.NORTH);
JTextArea ta=new JTextArea();
con.add(ta, BorderLayout.CENTER);
}
public static void main(String[]args){
PanelerDemo frame = new PanelerDemo();
frame.setTitle("Paneler Demo");
frame.setSize(300,200);
frame.setVisible(true);
}
}
•
•
•
•
8 - 16
Det går inte att rita direkt på en komponent. All ritning
kräver en grafisk omgivning, ett s.k. graphics context.
Javasystemet skapar automatiskt ett graphics context med
ett objekt av klassen Graphics. All ritning sker genom
anrop till metoder i Graphics-objektet
Klassen Graphics innehåller metoder för att bl.a :
– skriva text, samt rita linjer och figurer
• drawString, drawLine, drawRect, drawOval,.. .
– formatera text och ange färg
• setFont, setColor, .. .
– (visa bilder
• drawImage)
Klassen JPanel kan även användas för att rita grafik
(inklusive text)
Man skapar en ny klass som ärver JPanel och överskuggar
metoden paintComponent och Ex. för att skriva text i
grafisk mod:
class MinPanel extends JPanel {
public void paintComponent(Graphics g){
//super-klassens paintComponent
//SKA först anropas
super.paintComponent(g);
g.drawString(”Hej Världen!”, 50, 50);
}
}
•
Vid anropet av paintComponent överförs ett objekt av klassen
Graphics, ett graphics context. Med ett anrop till metoder i
Graphics-objektet ritar vi i panelen.
Koordinatsystem för
grafik
Klassen Color
• Positionerna i en rityta representeras med ett
koordinatsystem där varje punkt representerar en
bildpunkt (pixel).
• Koordinatsystemet har origo i övre vänstra hörnet,
med ökande X-koordinater åt höger och med
ökande Y-koordinater nedåt.
• Varje rityta har en bredd (width) och en höjd
(heigth). Det som ritas utanför ritytan kan inte
ses på skärmen.
X
<0,0>
8 - 18
8 - 17
• Klassen Color används för att ange färg
på grafiska komponenter.
• Ett färgobjekt skapas med:
Color c = new Color(r, g, b);
• Färgen defineras med tre rgb-värden (0..255)
som anger färgstyrkan för de grundfärgerna röd,
grön och blå.
– (255, 0, 0) ger röd
– (0, 0, 0) ger svart
– (255, 255 ,255) ger vit
• Ett ljusblått färgobjekt:
<55,30>
Color lightblue = new Color(175,175,255);
<width-1, height-1>
Y
Ritytan
• I klassen Color finns även 13 fördefinierade
färgobjekt med de vanligaste färgerna
Color.black, Color.red, .. .
8 - 20
8 - 19
Ange färger
•
•
Metoderna setForeground och setBackground i
klassen Component anger förgrunds- och bakgrundsfärg
på grafiska komponenter. Metoderna har ett objekt av
klassen Color som argument.
Exempel för att ange bakgrundsfärgen för en panel:
Color lightblue = new Color(175,175,255);
JPanel p1 = new JPanel();
p1.setBackground(lightblue);
Alt. med standardfärg:
JPanel p1 = new JPanel();
p1.setBackground(Color.white);
•
Klassen Graphics har metoden setColor för att
bestämma färg på geometriska figurer
Klassen Font
•
En objekt av klassen Font bestämmer textens typsnitt,
stil och storlek.
•
Font f = new Font(typsnitt, stil, storlek);
•
Typsnitt:
– SansSerif, Serif, Monospaced, Dialog,
eller DialogInput
– Helvetica, TimesRoman, Courier
•
• OBS! Det finns olika typsnitt på olika datorsystem
Stil:
– Font.PLAIN, Font.BOLD, Font.ITALIC
• Storlek:
– Anges i antal punkter, t ex 12
• Fonten sätts med metoden setFont som är definierad i
klasserna Component och Graphics.
Ex:
public void paint(Graphics g)
{
Font myFont = new Font("Times", Font.BOLD, 16);
g.setFont(myFont);
g.drawString("Welcome to Java", 20, 40);
//ange en ny font
g.setFont(new Font("Courier", Font.BOLD+Font.ITALIC, 12));
g.drawString("Welcome to Java", 20, 70);
}
•
Det finns också en FontMetrics-klass som kan
användas för att ta reda på längden på en textsträng med en
viss font
Några exempel på
fonter
Några metoder för
ritning
8 - 21
import javax.swing.*;
import java.awt.*;
public class DemoFonter extends JFrame{
public DemoFonter()
{
getContentPane().add(new RitPanel());
}
public static void main(String[]args){
DemoFonter frame = new DemoFonter();
frame.setTitle("Paneler Demo");
frame.setSize(200,150);
frame.setVisible(true);
}
}
8 - 22
• Klassen Graphics har bl.a följande ritmetoder
för geometriska figurer och text :
•
drawLine(x1, y1, x2, y2)
– Ritar en linje från punkten (x1, y1) till (x2,y2)
•
drawRect(x, y, b, h)
– Ritar en ofylld rektangel med övre vänster hörn i (x,y),
bredd b och höjd h. Kan även ritas i 3D
•
drawOval(x,y, b, h)
– Ritar en ofylld ellips som är inskriven i en rektangel med
övre vänster hörn i (x,y), bredd b och höjd h
class RitPanel extends JPanel {
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setFont(new Font("SansSerif", Font.PLAIN, 15));
g.drawString("Hej Världen!", 20, 20);
g.setFont(new Font ("Serif", Font.BOLD, 15));
g.drawString("Hej Världen!", 20, 40);
g.setFont(new Font("Monospaced", Font.PLAIN, 15));
g.drawString("Hej Världen!", 20, 60);
g.setFont(new Font("Dialog", Font.ITALIC, 15));
g.drawString("Hej Världen!", 20, 80);
g.setFont(new Font("DialogInput",
Font.PLAIN + Font.ITALIC, 15));
g.drawString("Hej Världen!", 20, 100);
}
}
•
drawPolygon(xp, yp, n)
– Ritar en ofylld månghörning. xp och yp är fält med
punkternas x- resp. y-koordinater. n är antalet punkter:
xp[] = {x1, x2, x3};
– (alt. drawPolygon(p), p är ett Polygon-objekt)
•
drawString(txt, x, y)
– Ritar textsträngen txt med början i punkten (x,y). ykoordinaten anger textens baslinje
•
De flesta figurer även kan ritas ifyllda (ex: fillRect). Övriga
ritmetoder: drawArc, drawPolyline
8 - 23
Ett grafikexempel
import javax.swing.*;
import java.awt.*;
public class DemoGrafik extends JFrame{
public DemoGrafik()
{
getContentPane().add(new RitPanel());
}
public static void main(String[]args){
DemoGrafik frame = new DemoGrafik();
frame.setTitle(”Grafik Demo");
frame.setSize(400,300);
frame.setVisible(true);
}
}
class RitPanel extends JPanel {
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawRect(25, 25, 100, 50);
g.setColor(Color.red);
g.fillOval(150, 100, 50, 50);
g.fillRect(50, 150, 50, 75);
g.drawLine(370, 20, 32, 250);
g.setColor(Color.yellow);
int[] xarr = {350, 350, 150, 225, 125};
int[] yarr = {100, 170, 250, 100, 50};
g.fillPolygon(xarr, yarr, 5);
}
}
8 - 24
Program- eller händelsestyrd
exekvering
• Programstyrd exekvering
– I ett ett textbaserat användargränssnitt
avgör programmet när det är dags för ineller utmatnig av data. Exekveringen är
programstyrd.
• Händelsestyrd (eng. event-driven) exekvering
– I ett program med grafiska användargränssnitt styrs programmets exekvering av
olika händelser som inträffar. Händelsen
initieras av någon aktivitet från användaren,
t.ex. ett musklick eller musrörelse eller
tangentnedtryckning. Programmet reagerar
när händelserna inträffar.
• Händelsestyrd programmering
– För att utveckla ett händelsestyrt program
som hanterar de händelser som inträffar
måste man oftast använda funktioner i något
grafiskt användarbibliotek
– I Java finns dessa som funktioner som klasser
i paketet java.awt.event
Javas modell för
händelsehantering
8 - 25
• Javas modell för händelsehantering bygger på
delegering. Ett källobjekt genererar en händelse
och en lyssnare utses som fångar upp och
hanterar händelsen.
• Så här hanteras en händelse i Java:
Händelseobjekt
Användar
-aktivitet
2. Skapa en
händelse
3. Meddela
lyssnare
1. Initiera en
händelse
Källobjekt
Registrera lyssnarobjekt
Lyssnarobjekt
Händelsehanterare
1. En yttre aktivitet (t.ex knappklickning), från en
användare på ett källobjekt initierar en
händelse.
– Det objekt som ska hantera händelsen
registreras som ett lyssnarobjekt
2. Källobjektet skapar ett händelseobjekt som
representerar händelsen.
3. Källobjektet meddelar lyssnaren att händelsen
inträffat genom att anropa en händelsehanterare i lyssnarobjektet
– Händelseobjektet skickas med som parameter
vid anropet till hanteraren
Ex: Hantering av en
ActionEvent-händelse
8 - 26
En knappklickning leder till att ett ActionEvent-objekt skapas.
Klassen ActionEventDemo är en lyssnare som hanterar händelsen
genom att implementera metoden actionPerformed i
lyssnargränssnittet ActionListener
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ActionEventDemo extends JFrame implements
ActionListener
{
private Button bt = new Button("OK");
private JTextField tf = new JTextField(14);
public ActionEventDemo() {
getContentPane().setLayout(new FlowLayout());
getContentPane().add(bt);
getContentPane().add(tf);
bt.addActionListener(this);
}
public static void main(String[] argument)
{
ActionEventDemo f = new ActionEventDemo();
f.setTitle("ActionEvent Demo");
f.setSize(250, 75);
Händelsehanterare
f.setVisible(true);
(Lyssnarmetod)
}
public void actionPerformed(ActionEvent event)
{
tf.setText("OK-knappen har klickats");
}
Händelseobjekt
}
Lyssnare som en inre
klass
8 - 27
Lyssnaren kan även definieras som en egen klass.
Eftersom den inte används av andra klasser defineras den
enklast som en inre klass
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ActionEventDemo extends JFrame
{
private Button bt = new Button("OK");
private JTextField tf = new JTextField(14);
public ActionEventDemo() {
getContentPane().setLayout(new FlowLayout());
getContentPane().add(bt);
getContentPane().add(tf);
bt.addActionListener(new Lyssnare());
}
private class Lyssnare implements ActionListener
// Inre klass
{
public void actionPerformed(ActionEvent event)
{
tf.setText(" OK-knappen har klickats ");
}
}
public static void main(String[] argument)
{
ActionEventDemo f = new ActionEventDemo();
f.setTitle("ActionEvent Demo");
f.setSize(250, 75);
f.setVisible(true);
}
}
Fånga och hantera
händelser
8 - 28
• För att hantera en händelse definierar man en
lyssnare och:
• (1) registrerar lyssnarobjektet som ska lyssna på
källobjektets händelser
• (2) implementerar de speciella lyssnarmetoder i
ett lyssnargränssnitt som motsvarar den aktuella
händelsen
• När en händelse inträffar anropas automatiskt
motsvarande lyssnarmetod i lyssnaren.
– Händelseobjektet skickas med som parameter
till lyssnarmetoden
Lyssnarobjekt
(1) bt.addActionListener(this);
(2) public void actionPerformed(ActionEvent event)
{
tf.setText("OK");
Lyssnarmetod
}
Händelseklass
Ex: Användaraktiviteter,
8 - 30
8 - 29
Händelseklasser
källobjekt och händelseklasser
Exempel några användaraktiviteter på källobjekt och
motsvarande händelseklasser:
Användaraktivitet
Klickat på en knapp
Trycka på retur i ett
textfält
Bytt textinnehåll
Dubbelklickat på ett
listobjekt
Markererat eller
avmarkerat element
med enkelklick
Markererat eller
avmarkerat element
Källobjekt
JButton
JTextField
Händelseklass
ActionEvent
ActionEvent
• En händelse representeras med ett objekt av
någon av följande klasser i paketet
java.awt.event:
EventObject
AWTEvent
JTextComponent TextEvent
JList
ActionEvent
JList
ActionEvent
ContainerEvent
AdjustmentEvent
FocusEvent
ComponentEvent
InputEvent
ItemEvent
PaintEvent
TextEvent
WindowEvent
MouseEvent
KeyEvent
ItemEvent
ListSelectionEvent
JComboBox
ItemEvent
Händelseobjektet innehåller uppgift om bl.a:
• source:
Den komponent på vilken
händelsen inträffade
• x, y koord.:
Muspekarens läge när en
”mouse movement” händelse
inträffat
• clickCount:
Antalet musklick vid en
MouseEvent
• key:
Den tangent som tryckts
ned eller släppts upp.
Gemensam lyssnare för
flera händelser
8 - 31
Om flera källobjekt genererar händelser som ska
hanteras av samma lyssnare måste denna först
identifiera källobjektet.
Antag att vi kan klicka på två knappar med namnen
btOK och btAvbryt. Lyssnaren registreras med:
8 - 32
Händelseklasser, lyssnargränssnitt och lyssnarmetoder
Händelseklass
Lyssnargränssnitt
ActionEvent
ItemEvent
WindowEvent
ActionListener
ItemListener
WindowListener
btOK.addActionListener(this);
btAvbryt.addActionListener(this);
ContainerEvent
Metoden getSource() i ActionEvent returnerar
källobjektet som ska identifieras:
public void actionPerformed(ActionEvent event)
{
if (event.getSource() == btOK)
tf.setText("OK-knappen har klickats");
else if (event.getSource() == btAvbryt)
tf.setText(“Avbryt-knappen har klickats");
}
ComponentEvent
FocusEvent
TextEvent
KeyEvent
MouseEvent
AdjustmentEvent
Lyssnarmetod
(hanterare)
actionPerformed
itemStateChanged
windowClosing
windowOpened
windowIconified
windowDeiconified
windowClosed
windowActivated
windowDeactivated
ContainerListener
componentAdded
componentRemoved
ComponentListener
componentMoved
componentHidden
componentResized
componentShown
FocusListener
focusGained
focusLost
TextListener
textValueChanged
KeyListener
keyPressed
keyReleased
keyTyped
MouseListener
mousePressed
mouseReleased
mouseEntered
mouseExited
mouseClicked
MouseMotionListener mouseDragged
mouseMoved
AdjustmentListener adjustmentValueChanged
Namnkonventioner
för händelser och lyssnare
•
•
8 - 33
Det finns normalt ett lyssnargränssnitt för varje
händelseklass.
Namnet på händelseklassen motsvaras av namnet på
lyssnargränssnittet och namnet på metoden för att
registrera en lyssnare till en komponent
Ex:
…
ok.addActionListener(new Lyssnare());
class Lyssnare implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
result.setText(”OK”);
}
}
Händelseklass: ActionEvent
Registrera lyssnare: addActionListener
Lyssnargränssnitt: ActionListener
Allmänt:
Lyssnare registreras med addXListener för XEvent
Lyssnargränssnittet heter XListener för XEvent