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