package elte.java2_utikalauz5.gui; /** Alacsonyszintű beviteli események rögzítése és visszajátszása. Példaprogramunk egyszerűsége érdekében csak a módosítóbillentyűk állapotát tartjuk nyilván, valamint felvételkor csak egyetlen ablakon belül végzünk eseményfigyelést (így a menük használatát nem tudjuk rögzíteni).

A felhasználói felület igen egyszerű: két gomb, köztük pedig a felvétel/lejátszás állapota látható. A felső gombbal lehet felvételt indítani és leállítani, a lejátszás pedig az alsó gomb megnyomására kezdődik. Persze ez a példaprogramunk viszonylag egyszerű, de az összes többi példával összefogva érdemes vele kísérletezni. @link.forrásfájl {@docRoot}/../data/gui/src RoboTeszt.java @link.letöltés {@docRoot}/../data/gui RoboTeszt.jar @see java.awt.Robot @since Java 2 Útikalauz programozóknak 5.0 */ class RoboTeszt implements java.awt.event.AWTEventListener, java.awt.event.ActionListener, Runnable { /** Rögzített események */ private java.awt.AWTEvent események[] = new java.awt.AWTEvent[1000]; /** Az aktuális esemény indexe */ private int index; /** Felvételt indító és megállító gomb */ private java.awt.Button rögzítés = new java.awt.Button("Felvétel"); /** Felvételt jelölő jelző */ private boolean rögzít; /** Pozíciókijelző címke */ private java.awt.Label címke=new java.awt.Label("Nincs még semmi felvéve!", java.awt.Label.CENTER); /** Visszajátszást indító gomb */ private java.awt.Button lejátszás = new java.awt.Button("Visszajátszás"); /** Visszajátszást jelölő jelző */ static boolean lejátsz; /** GUI-t felépítő konstruktor. @param felület a felhasználói felületet tartalmazó konténer */ RoboTeszt( java.awt.Container felület ) { felület.setLayout( new java.awt.GridLayout(3, 1) ); felület.add( rögzítés ); rögzítés.addActionListener( this ); felület.add( címke ); felület.add( lejátszás ); lejátszás.addActionListener( this ); } /** AWT események eltárolása. @param esemény a fellépett esemény */ public void eventDispatched(java.awt.AWTEvent esemény) { események[index++]=esemény; if (index==események.length) stop(); státusz(); } /** Felvétel indítása */ void start() { rögzítés.setLabel("Befejezés"); index = 0; rögzít = true; státusz(); java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(this, java.awt.AWTEvent.KEY_EVENT_MASK|java.awt.AWTEvent.MOUSE_EVENT_MASK| java.awt.AWTEvent.MOUSE_MOTION_EVENT_MASK| java.awt.AWTEvent.MOUSE_WHEEL_EVENT_MASK); } /** Felvétel leállítása */ void stop() { java.awt.Toolkit.getDefaultToolkit().removeAWTEventListener( this ); rögzít = false; rögzítés.setLabel("Felvétel"); státusz(); } /** Felvétel/lejátszás pozíciójának kijelzése */ void státusz() { String mód = ""; if (rögzít) mód = "Felvétel: "; else if (lejátsz) mód = "Lejátszás: "; címke.setText(mód+index+" / "+események.length); } /** Program vezérlése. @param esemény A nyomógomb eseménye */ public void actionPerformed( java.awt.event.ActionEvent esemény ) { if (lejátsz) return; if (esemény.getSource()==rögzítés) { if (rögzít) stop(); else start(); } else { if (rögzít) return; lejátsz = true; new Thread( this ).start(); } } /** Egérgombaszkok hozzárendelése a getButton() értékéhez */ private static final int egérgombmaszk[] = {0, java.awt.event.InputEvent. BUTTON1_MASK, java.awt.event.InputEvent.BUTTON2_MASK, java.awt.event.InputEvent.BUTTON3_MASK}; /** Billentyűmaszkok és kódok a robot használatához */ final int maszkok[] = {java.awt.event.InputEvent.BUTTON1_DOWN_MASK,java.awt. event.InputEvent.BUTTON2_DOWN_MASK,java.awt.event.InputEvent.BUTTON3_DOWN_MASK, java.awt.event.InputEvent.SHIFT_DOWN_MASK,java.awt.event.KeyEvent.VK_SHIFT, java.awt.event.InputEvent.CTRL_DOWN_MASK,java.awt.event.KeyEvent.VK_CONTROL, java.awt.event.InputEvent.ALT_DOWN_MASK,java.awt.event.KeyEvent.VK_ALT,java. awt.event.InputEvent.ALT_GRAPH_DOWN_MASK,java.awt.event.KeyEvent.VK_ALT_GRAPH, java.awt.event.InputEvent.META_DOWN_MASK,java.awt.event.KeyEvent.VK_META}; /** Lejátszás */ public void run() { int eseménymaszk = 0; //módosítóbillentyűk állapotának követése java.awt.Robot robot = null; try { robot = new java.awt.Robot(); robot.setAutoWaitForIdle( true ); int maxindex = index; index = 0; long kezdőidő = 0; //esemény időpontja az időzítéshez while (index < maxindex) { java.awt.event.InputEvent esemény = (java.awt.event.InputEvent)események[index]; java.awt.Component komponens = esemény.getComponent(); if (!komponens.isShowing()) { //láthatóság biztosítása java.awt.Container konténer = komponens.getParent(); java.awt.Component elem = komponens; while (!(konténer instanceof java.awt.Window)) { elem = konténer; konténer = elem.getParent(); } if (konténer.getLayout() instanceof java.awt.CardLayout) for (java.awt.Component komp : konténer.getComponents()) komp.setVisible(komp==elem); } //módosítóbillentyűk állapotellenőrzése for (int maszkindex = maszkok.length; --maszkindex>=0;) { boolean egér = maszkindex < 3; int billentyűkód = egér ? maszkindex+1 :maszkok[maszkindex]; if (!egér) maszkindex--; int billentyűmaszk = maszkok[maszkindex]; int maszk = esemény.getModifiersEx() & billentyűmaszk; if ( maszk != (eseménymaszk & billentyűmaszk)) if (egér) { //egérgombok állapotellenőrzése boolean később = esemény instanceof java.awt.event. MouseEvent&&((java.awt.event.MouseEvent)esemény). getButton()==billentyűkód; billentyűkód = egérgombmaszk[billentyűkód]; if ( maszk > 0 ) { if (!később) robot.mousePress(billentyűkód); eseménymaszk += billentyűmaszk; } else { if (!később) robot.mouseRelease(billentyűkód); eseménymaszk -= billentyűmaszk; } } else { //módosítóbillentyűk állapotellenőrzése boolean később = esemény instanceof java.awt.event. KeyEvent && ((java.awt.event.KeyEvent)esemény). getKeyCode()==billentyűkód; if ( maszk > 0 ) { if (!később) robot.keyPress(billentyűkód); eseménymaszk += billentyűmaszk; } else { if (!később) robot.keyRelease(billentyűkód); eseménymaszk -= billentyűmaszk; } } } //események bekövetkeztének megfelelő időzítés long idő = System.currentTimeMillis(); if (index==0) kezdőidő = idő - esemény.getWhen(); else { idő = esemény.getWhen()-idő+kezdőidő; if (idő > 0) Thread.sleep(idő); } //billentyűesemények szimulálása if (esemény instanceof java.awt.event.KeyEvent) { java.awt.event.KeyEvent billentyűesemény = (java.awt.event.KeyEvent)esemény; int kód = billentyűesemény.getKeyCode(); if (kód == billentyűesemény.VK_UNDEFINED) { if (esemény.getID() == billentyűesemény.KEY_PRESSED && komponens instanceof java.awt.TextComponent) { java.awt.TextComponent mező=(java.awt.TextComponent) komponens; //szövegmezőnek minden leütés átadása if (mező.isEditable()) { String szöveg = mező.getText(); int kurzor = mező.getCaretPosition()+1; mező.setText(szöveg.substring(0, mező. getSelectionStart()) + billentyűesemény. getKeyChar() + szöveg.substring( mező. getSelectionEnd(), szöveg.length())); mező.setCaretPosition(kurzor); } } } else if (esemény.getID() == billentyűesemény.KEY_PRESSED) robot.keyPress( kód ); else if (esemény.getID()==billentyűesemény.KEY_RELEASED) robot.keyRelease( kód ); } else { //egéresemények szimulálása java.awt.event.MouseEvent egéresemény = (java.awt.event.MouseEvent)esemény; java.awt.Point origó = komponens.getLocationOnScreen(); robot.mouseMove( origó.x+egéresemény.getX(), //pozícionálás origó.y+egéresemény.getY() ); if (esemény.getID() == egéresemény.MOUSE_PRESSED) robot.mousePress(egérgombmaszk[egéresemény.getButton()]); else if (esemény.getID() == egéresemény.MOUSE_RELEASED) robot.mouseRelease(egérgombmaszk[egéresemény.getButton()]); else if (esemény.getID() == egéresemény.MOUSE_WHEEL) robot. mouseWheel(((java.awt.event.MouseWheelEvent)esemény).getWheelRotation()); } index++; státusz(); } } catch (Exception e) { e.printStackTrace(); } finally { //lenyomva maradt módosítóbillentyűk felengedése for (int maszkindex = maszkok.length; --maszkindex >= 0; ) { boolean egér = maszkindex < 3; int billentyűkód = egér ? maszkindex+1 : maszkok[maszkindex]; if (!egér) maszkindex--; if ( (eseménymaszk & maszkok[maszkindex]) > 0 ) if (egér) robot.mouseRelease(egérgombmaszk[billentyűkód]); else robot.keyRelease(billentyűkód); } lejátsz = false; státusz(); } } /** A grafikus felhasználói felület felépítése. @param felület A felhasználói felületet tartalmazó konténer. @param argumentumok Az indításkor megadott paraméterek. */ public static void felépít(java.awt.Container felület, String argumentumok[]) { new RoboTeszt( felület ); //felület felépítése } /** A tesztprogram indítása. @param argumentumok Az indításkor megadott paraméterek. */ public static void main(String argumentumok[]) { java.awt.Frame ablak=new AblakTeszt.Ablak("Eseményrögzítés/lejátszás"); felépít( ablak, argumentumok ); //felület felépítése ablak.setVisible(true); //és megjelenítése } }