Programstyrd / händelsestyrd Jevent - 1 Händelsestyrda program Jevent - 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 Händelsestyrda program brukar bestå av två faser. Först genomlöps initieringensfasen. I den initierar man de olika grafiska komponenter som kommer att användas i programmet. Man definierar också s.k. callbackfunktioner som skall ta hand om de händelser man är intresserad av. I Java definieras dessa callback-funktioner som metoder i speciella lyssnare När initieringsfasen är slut går programmet in i väntefasen I väntefasen ligger programmet och väntar på att en yttre händelse skall inträffa 1
Implementering av Lyssnargränssnittet Jevent - 3 En alternativ implementering av Lyssnargränssnittet Jevent - 4 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); 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 = new TextField(10); //Här definieras en inre klass private class Lyssnare implements ActionListener 2
Att lyssna på händelser Jevent - 5 Händelseklasser Jevent - 6 I Java beskrivs olika händelser med hjälp av händelseklasser EventObject När en händelse inträffar skapas ett objekt av den klass som beskriver händelsen TextEvent AWTEvent ActionEvent Därefter efter anropas en metod i den lyssnare som definieras att lyssna på den typen av händelser ItemEvent ComponentEvent AdjustmentEvent Som parameter till metoden i lyssnaren ges då det skapade händelseobjektet Lyssnarklassen Lyssnargränssnittet WindowEvent PaintEvent FocusEvent ContainerEvent private class Lyssnare implements ActionListener Händelseklassen KeyEvent InputEvent MouseEvent 3
Lyssnarklasser och lyssnargränssnitt Jevent - 7 Namnkonventioner Jevent - 8 För att fånga en händelse måste man skapa en lyssnare som en instans av en lyssnarklass Händelse markerar händelsens namn Lyssnarklassen måste man själv definera Lyssnarklassen måste innehålla de speciella metoder som systemet automatiskt anropar när en händelse inträffar För varje händelseklass finns ett motsvarande lyssnargränssnitt Varje lyssnarklass måste implementera ett av dessa gränssnitt, direkt eller indirekt ok.addhändelselistener(new Lyssnare()); class Lyssnare implements HändelseListner public void actionperformed(händelseevent event) result.settext( OK ); Ett lyssnarobjekt skapas ok.addactionlistener(new Lyssnare()); Lyssnarklassen Lyssnargränssnittet private class Lyssnare implements ActionListener Händelseklassen Metod som hanterar händelsen 4
Jevent - 9 Jevent - 10 Händelser, del 1 Händelser, del 2 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 FokusEvent focusgained Component focuslost 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 ---------------------------------------------------------- (*) För de båda händelserna mousedragged och mousemoved är händelseklassen MouseEvent men gränssnittet är inte MouseListener utan MouseMotionListener 5
Att identifiera rätt komponent, getsource() Jevent - 11 Att identifiera rätt komponent, separata lyssnare, del 1 Jevent - 12 public class Test extends Applet private Button ok, ångra, hjälp; public void init() ok = new Button("OK"); ok.addactionlistener(new KnappLyssnare()); add(ok); import java.applet.*; 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 if (event.getsource() == 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
Att identifiera rätt komponent, separata lyssnare, del 2 Jevent - 13 Att identifiera rätt komponent, anonyma klasser, del 1 Jevent - 14 class OKLyssnare implements ActionListener 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() ); add(ok); 7
Att identifiera rätt komponent, anonyma klasser, del 2 Jevent - 15 Adapterklasser, del 1 Jevent - 16 å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
Jevent - 17 Jevent - 18 Adapterklasser, del 2 Adapterklasser, del 3 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 Jevent - 19 Mushändelser, del 2 Jevent - 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 WindowLyssnare extends WindowAdapter public void windowclosing(windowevent event) System.exit(0); 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); private class WindowLyssnare extends WindowAdapter public void windowclosing(windowevent event) System.exit(0); public static void main(string[] argument) Test mintest = new Test(); private class MusLyssnare extends MouseAdapter 1
MouseEvent Jevent - 21 KeyEvent Jevent - 22 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() Anger om användaren tryckt på mittknappen ismetadown() Anger om användaren tryckt på högerknappen isaltdown() Anger om användaren höll Alt-tangenten nere isshiftdown() Anger om användaren höll Shift-tangenten nere 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() Anger om användaren höll ner Alt-tangenten iscontroldown() Anger om användaren höll ner Ctrl-tangenten ismetadown() Anger om användaren höll ner Meta-tangenten ishiftdown() Anger om användaren höll ner Shift-tangenten 1
Exempel, KeyEvent, del 1 Jevent - 23 Exempel, KeyEvent, del 2 Jevent - 24 public class Test extends Frame public Test() addwindowlistener(new WindowLyssnare()); addkeylistener(new KnappLyssnare()); 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 KnappLyssnare 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(); 1