JavaD- 1 Program- eller händelsestyrd exekvering Händelsestyrda program JavaD- 2 Programstyrd exekvering I ett traditionellt program bestämmer programmet när det är dags att läsa indata, programmets exekvering är programstyrd. Händelsestyrd exekvering I ett program med grafiska användargränssnitt styrs exekveringen av de händelser som initieras av användaren Programutveckling För att utveckla ett händelsestyrt program måste man behärska en stor mängd färdigskrivna funktioner i något grafiskt användarbiblotek Exekveringen av händelsestyrda program består av två faser. 1. I initieringsfasen initierar man de olika grafiska komponenter som kommer att användas i programmet. Man definierar även s.k. callbackfunktioner som skall ta hand om de händelser man är intresserad av. I Java (JDK 1.1) implementeras dessa funktioner som lyssnarmetoder i speciella lyssnargränssnitt (JDK 1.0 har en gammal modell för händelsehantering utan speciella lyssnare) 2. I väntefasen ligger programmet sedan och väntar på att en yttre händelse, t.ex. ett musklick, skall inträffa. När händelsen inträffar anropas i Java den lyssnarmetod som hanterar händelsen 1
Enkel implementering av lyssnargränssnitt JavaD- 3 JavaD- 4 Implementering av lyssnargränssnitt i inre klass import java.applet.*; import java.applet.*; public class Test extends Applet implements ActionListener private Button ok; public void init() ok = new Button("OK"); ok.addactionlistener(this); add(ok); Lyssnargränssnittet implementeras i klassen Test public class Test extends Applet private Button ok; public void init() ok = new Button("OK"); ok.addactionlistener(new Lyssnare()); add(ok); resultat = new TextField(10); resultat.settext("ok"); resultat = new TextField(10); Lyssnargränssnittet implementeras i inre klassen Lyssnare private class Lyssnare implements ActionListener resultat.settext("ok"); 2
Att generera händelser JavaD- 5 Händelseklasser JavaD- 6 1. I Java representeras olika händelser av händelseklasser. När en händelse inträffar skapar händelsekällan, den komponent som genererar händelsen, ett händelseobjekt som representerar händelsen 2. Därefter efter anropas automatiskt en lyssnarmetod i det lyssnarobjekt som är kopplad till händelsen Som parameter till lyssnarmetoden ges det skapade händelseobjektet TextEvent ItemEvent EventObject AWTEvent ActionEvent AdjustmentEvent Händelsekälla new Anropar lyssnarmetod WindowEvent ComponentEvent ContainerEvent Händelseobjekt Lyssnarobjekt PaintEvent FocusEvent Lyssnarklassen InputEvent private class MyListener implements ActionListener resultat.settext("ok"); Händelseklassen KeyEvent MouseEvent 3
Att lyssna på händelser JavaD- 7 Händelser, del 1 JavaD- 8 1. För att fånga en händelse definierar man en lyssnarklass som implementerar de speciella lyssnarmetoder i ett lyssnargränssnitt som motsvarar den aktuella händelseklassen 2. Ett lyssnarobjekt skapas och registreras att lyssna på den komponent som utgör händelsekällan När en händelse inträffar anropas automatiskt den lyssnarmetod som motsvarar händelsen ok.addactionlistener(new Lyssnare()); Lyssnarklass Ett lyssnarobjekt skapas Lyssnargränssnitt private class Lyssnare implements ActionListener public void actionperformed (ActionEvent event) resultat.settext("ok"); Lyssnarmetod Händelseklass Händelseklass Händelser Genereras av ==================================================================== ActionEvent actionperformed Button List MenuItem TextField AdjustmentEvent adjustmentvalue- Scrollbar Changed ItemEvent itemstatechanged Checkbox, CheckboxMenuItem Choise, List ComponentEvent componenthidden Component componentmoved componentresized componentshown ContainerEvent componentadded Container comonentremoved FocusEvent focusgained Component focuslost 4
Händelser, del 2 JavaD- 9 Namnkonventioner för lyssnare JavaD- 10 Händelseklass Händelser Genereras av ==================================================================== WindowEvent windowactivated Window windowclosed windowclosing windowdeactivated windowdeiconified windowiconified windowopened InputEvent se subklasser se subklasser KeyEvent keypressed Component keyreleased keytyped MouseEvent mouseclicked Component mouseentered mouseexited mousepressed mousereleased ---------------------------------------------------------- (*) mousedragged Component mousemoved ---------------------------------------------------------- Namnet på lyssnargränssnittet samt metoden för att registrera en lyssnare till en komponent har sina motsvarigheter i namnet på händelseklassen. I formen nedan markerar <xxx> namnet på händelseklassen ok.add<xxx>listener(new Lyssnare()); class Lyssnare implements <xxx>listener public void actionperformed(< xxx>event event) result.settext( OK ); (*) För de båda händelserna mousedragged och mousemoved är händelseklassen MouseEvent men gränssnittet är inte MouseListener utan MouseMotionListener 5
Identifiera komponent med gemensam lyssnare JavaD- 11 Identifiera komponent, separata lyssnare, del 1 JavaD- 12 public class Test extends Applet private Button ok, ångra, hjälp; import java.applet.*; public void init() ok = new Button("OK"); ok.addactionlistener(new KnappLyssnare()); add(ok); public class Test extends Applet private Button ok, ångra, hjälp; ångra = new Button("ÅNGRA"); ångra.addactionlistener(new KnappLyssnare()); add(ångra); hjälp = new Button("HJÄLP"); hjälp.addactionlistener(new KnappLyssnare()); add(hjälp); resultat = new TextField(10); class KnappLyssnare implements ActionListener public void actionperformed( ActionEvent event) if (event.getsource() == ok ) resultat.settext("ok"); if (event.getsource() == ångra ) resultat.settext("ångra"); if (event.getsource() == hjälp ) resultat.settext("hjälp"); public void init() ok = new Button("OK"); ok.addactionlistener(new OKLyssnare()); add(ok); ångra = new Button("ÅNGRA"); ångra.addactionlistener(new ÅngraLyssnare()); add(ångra); hjälp = new Button("HJÄLP"); hjälp.addactionlistener(new HjälpLyssnare()); add(hjälp); resultat = new TextField(10); 6
Identifiera komponent, separata lyssnare, del 2 JavaD- 13 Identifiera komponent, anonyma klasser, del 1 JavaD- 14 class OKLyssnare implements ActionListener resultat.settext("ok"); class ÅngraLyssnare implements ActionListener resultat.settext("ångra"); import java.applet.*; public class Test extends Applet private Button ok, ångra, hjälp; public void init() ok = new Button("OK"); // Lyssnaren uttrycks här som en anonym klass // Det vill säga en klass utan namn! class HjälpLyssnare implements ActionListener resultat.settext("hjälp"); // Den anonyma klassen implementerar // metoden actionperformed i gränssnittet // ActionListener ok.addactionlistener(new ActionListener() resultat.settext("ok"); ); add(ok); 7
Identifiera komponent, anonyma klasser, del 2 JavaD- 15 JavaD- 16 Lyssnargränssnitt med flera metoder ångra = new Button("ÅNGRA"); ångra.addactionlistener(new ActionListener() resultat.settext("ångra"); ); add(ångra); hjälp = new Button("HJÄLP"); hjälp.addactionlistener(new ActionListener() resultat.settext("hjälp"); ); add(hjälp); resultat = new TextField(10); public class Test extends Applet public void init() addmouselistener(new Lyssnare()); resultat = new TextField(80); private class Lyssnare implements MouseListener public void mouseclicked(mouseevent event) resultat.settext("du klickade: " + event); public void mousepressed(mouseevent event) public void mousereleased(mouseevent event) public void mouseentered(mouseevent event) public void mouseexited(mouseevent event) 8
Egendefinierad adapterklass JavaD- 17 Fördefinierad adapterklass JavaD- 18 import java.applet.*; import java.applet.*; public class Test extends Applet public void init() addmouselistener(new Lyssnare()); resultat = new TextField(80); private class Lyssnare extends MinAdapter public void mouseclicked(mouseevent event) resultat.settext("du klickade: " + event); //-fil: MinAdapter.java --------------------------------- public class MinAdapter implements MouseListener public void mouseclicked(mouseevent event) public void mousepressed(mouseevent event) public void mousereleased(mouseevent event) public void mouseentered(mouseevent event) public void mouseexited(mouseevent event) public class Test extends Applet public void init() addmouselistener(new Lyssnare()); resultat = new TextField(80); // Det finns en adapterklass för varje gränssnitt // som hanterar mer än en typ av händelse private class Lyssnare extends MouseAdapter public void mouseclicked(mouseevent event) resultat.settext("du klickade: " + event); 9
Mushändelser, del 1 JavaD- 19 Mushändelser, del 2 JavaD- 20 public class Test extends Frame private TextField koordinat; private TextField klickningar; public Test() addwindowlistener(new WindowLyssnare()); addmouselistener(new MusLyssnare()); setlayout(new FlowLayout()); koordinat = new TextField("Här kommer koordinaten"); add(koordinat); klickningar = new TextField("Här kommer antalet klickningar"); add(klickningar); setsize(400, 200); setvisible(true); private class MusLyssnare extends MouseAdapter public void mouseclicked(mouseevent event) int x = event.getx(); int y = event.gety(); int antal = event.getclickcount(); koordinat.settext("koordinat (" + x + ", " + y + ")"); klickningar.settext("antal klickningar: " + antal); public static void main(string[] argument) Test mintest = new Test(); private class WindowLyssnare extends WindowAdapter public void windowclosing(windowevent event) System.exit(0); private class MusLyssnare extends MouseAdapter 10
MouseEvent-metoder JavaD- 21 KeyEvent-metoder JavaD- 22 För händelseklassen MouseEvent kan följande metoder användas för att få reda på mer info om den inträffade mushändelsen. getx(), gety() Ger x- respektive y-koordinaten för musens placering getpoint() Ger ett Point-objekt som anger musens placering getclickcount() Anger hur många gånger användaren klickar getcomponent() Ger den grafiska komponent som musen befinner sig i iscontroldown(), ismetadown(), Anger om användaren tryckt på mittknappen, repektive högerknappen isshiftdown(), isaltdown() Anger om användaren höll Alt-tangenten resepektive Shift-tangenten nere För händelseklassen KeyEvent kan följande metoder användas för att få reda på mer info om den inträffade tangentbordshändelsen. getkeycode() Ger tangentnummret (virtual key kode) vid händelser VK_namn En konstant med tangennumret för tangent namn getkeytext(n) Översätter tangentnumret n till text getkeychar() Genererar tecknet (en char) vid händelsen keytyped isaltdown(), iscontroldown(), ismetadown(), ishiftdown() Anger om användaren höll ner Alt-tangenten, Ctrltangenten, Meta-tangenten respektive Shifttangenten 11
Exempel, KeyEvent, del 1 JavaD- 23 Exempel, KeyEvent, del 2 JavaD- 24 public class Test extends Frame public Test() addwindowlistener(new WindowLyssnare()); addkeylistener(new TangentLyssnare()); setsize(400, 200); setvisible(true); private class WindowLyssnare extends WindowAdapter public void windowclosing(windowevent event) System.exit(0); Utskrift i konsolfönstret G:\java\events>java Test Tangenten F nedtryckt. Tangenten U nedtryckt. Tangenten 7 nedtryckt. Tangenten Shift nedtryckt. Tangenten 3 nedtryckt. Tangenten Back Quote nedtryckt. Tangenten L nedtryckt. Tangenten K nedtryckt. Tangenten J nedtryckt. Tangenten K nedtryckt. Tangenten L nedtryckt. Tangenten Back Quote nedtryckt. Tangenten L nedtryckt. Tangenten Back Quote nedtryckt. private class TangentLyssnare extends KeyAdapter public void keypressed(keyevent event) System.out.println("Tangenten " + KeyEvent.getKeyText(event.getKeyCode()) + " nedtryckt."); public static void main(string[] argument) Test mintest = new Test(); 12