package elte.java2_utikalauz5.gui; /** Üres felhasználói felület beviteli események figyelésére és kilistázására. A szabványos kimeneten nyomkövethetjük az összes fellépő beviteli eseményt. @link.forrásfájl {@docRoot}/../data/gui/src EsemenyTeszt.java @link.letöltés {@docRoot}/../data/gui EsemenyTeszt.jar @since Java 2 Útikalauz programozóknak 5.0 */ class EsemenyTeszt implements java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.awt.event.MouseWheelListener, java.awt.event.AWTEventListener, java.awt.event.HierarchyListener { /***************************Új AWT tesztesemény.***************************/ class SajatEsemeny extends java.awt.AWTEvent { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Konstruktor forráskomponenssel és azonosítószámmal */ SajatEsemeny() { super(EsemenyTeszt.this, RESERVED_ID_MAX+1); //első szabad azonosító } /** Eseményobjektum részletei nyomkövetéshez. @return Azonosítószám + (osztálynév) */ public String paramString() { return getID()+" ("+getClass().getName()+")"; } }//************************************************************************* /** Általános switch megvalósítás. @param mit a keresett objektum @param miből a választási lehetőségek @return A lehetséges választékból egyezés esetén a megelőző objektum, vagy üres szöveg, ha nincs találat. */ private static Object kiválaszt(Object mit, Object... miből) { Object utolsó = null; for ( Object mi : miből ) { if (mi.equals(mit)) return utolsó; utolsó = mi; } return ""; //nincs találat } /** Az eseményfigyelők listája */ private java.util.Vector eseményFigyelők; /** Eseményfigyelő regisztrálása. @param eseményFigyelő a regisztrálandó eseményfigyelő */ public synchronized void addAWTEventListener( java.awt.event.AWTEventListener eseményFigyelő ) { if (eseményFigyelők==null) eseményFigyelők = //igény esetén létrehozás new java.util.Vector(); else if (eseményFigyelők.contains( eseményFigyelő )) return; eseményFigyelők.add( eseményFigyelő ); //eseményfigyelő felvétele } /** Eseményfigyelő regisztrálásának törlése. @param eseményFigyelő a törlendő eseményfigyelő */ public synchronized void removeAWTEventListener( java.awt.event.AWTEventListener eseményFigyelő ) { if (eseményFigyelők==null) return; //még nincs senki regisztrálva if (eseményFigyelők.remove(eseményFigyelő) && //törlés a listából eseményFigyelők.size()==0) //ha már nincs rá szükség, törölhető eseményFigyelők = null; } /** Eseményfigyelők értesítése. @param esemény az értesítéskor átadandó eseményobjektum */ protected synchronized void processSajátEsemény(java.awt.AWTEvent esemény) { if (eseményFigyelők==null) return; //még nincs senki regisztrálva for (java.awt.event.AWTEventListener figyelő : eseményFigyelők) figyelő.eventDispatched( esemény ); //figyelők értesítése } /** AWT eseményekről értesítés. @param esemény a fellépett esemény */ public void eventDispatched(java.awt.AWTEvent esemény) { System.out.println("*** AWTEvent: ID="+esemény.paramString()); if (esemény.getID()==java.awt.event.WindowEvent.WINDOW_CLOSING) System.exit(0); //ablakbecsukáskor kilépés } /** Megjelenítéskor fókuszkérés a billentyűzeteseményekhez. @param esemény a komponenshierarchia változási eseménye */ public void hierarchyChanged( java.awt.event.HierarchyEvent esemény ) { if ((esemény.getChangeFlags() & java.awt.event.HierarchyEvent. SHOWING_CHANGED)!=0 && esemény.getComponent().isShowing()) esemény.getComponent().requestFocus(); } /** Saját esemény generálásához véletlenszám generátor */ private java.util.Random véletlenszámgenerátor = new java.util.Random(); /** Bemeneti események alapjellemzőinek listázása. @param esemény a fellépett esemény @param prefix az azonosító konstansnevének előtagja @param azonosítók azonosító konstansnevek és értékek @return az elkészített lista */ private StringBuilder alaplistáz(java.awt.event.InputEvent esemény, String prefix, Object... azonosítók) { if (véletlenszámgenerátor.nextInt(10)==0) //10% eséllyel processSajátEsemény(new SajatEsemeny()); //saját esemény kiváltása StringBuilder sb = new StringBuilder(128); //leírás felépítése sb.append("ID=").append(prefix).append("_").append( //azonosító kiválaszt(esemény.getID(), azonosítók)); //konstansneve sb.append(", when=").append(esemény.getWhen()); //esemény időpontja sb.append(", modifiersEx=").append( //módosítóbillentyűk állapota java.awt.event.InputEvent.getModifiersExText( esemény.getModifiersEx())); return sb.append("\n\t"); } /** Billentyűlenyomási értesítés. @param billentyűEsemény Az aktuális eseményobjektum. */ public void keyPressed(java.awt.event.KeyEvent billentyűEsemény) { System.out.println(listáz(billentyűEsemény)); //információk kilistázása } /** Billentyűfelengedési értesítés. @param billentyűEsemény Az aktuális eseményobjektum. */ public void keyReleased(java.awt.event.KeyEvent billentyűEsemény) { System.out.println(listáz(billentyűEsemény)); //információk kilistázása } /** Billentyűmegnyomási értesítés. @param billentyűEsemény Az aktuális eseményobjektum. */ public void keyTyped(java.awt.event.KeyEvent billentyűEsemény) { System.out.println(listáz(billentyűEsemény)); //információk kilistázása } /** Billentyűzet események alapjellemzőinek listázása. @param esemény a fellépett billentyűesemény @return az elkészített lista */ private StringBuilder listáz(java.awt.event.KeyEvent esemény) { StringBuilder sb = new StringBuilder(256); sb.append(alaplistáz(esemény, "KEY",//azonosító konstansnevek és értékek "PRESSED", java.awt.event.KeyEvent.KEY_PRESSED, "RELEASED", java.awt.event.KeyEvent.KEY_RELEASED, "TYPED", java.awt.event.KeyEvent.KEY_TYPED)); sb.append("code=VK_"); //virtuális billentyűkód if (esemény.getKeyCode()==java.awt.event.KeyEvent.VK_UNDEFINED) sb.append("UNDEFINED"); //nincs kód else sb.append(java.awt.event.KeyEvent.getKeyText( esemény.getKeyCode()).toUpperCase()); sb.append(", char="); //beütött unicode karakter if (esemény.getKeyChar()==java.awt.event.KeyEvent.CHAR_UNDEFINED) sb.append("CHAR_UNDEFINED"); //nincs karakter else sb.append(String.format("%1$c (\\u%1$04x)", (int)esemény.getKeyChar())); sb.append(", location=KEY_LOCATION_").append( //billentyűhely konstansok kiválaszt(esemény.getKeyLocation(), "LEFT", java.awt.event.KeyEvent.KEY_LOCATION_LEFT, "NUMPAD", java.awt.event.KeyEvent.KEY_LOCATION_NUMPAD, "RIGHT", java.awt.event.KeyEvent.KEY_LOCATION_RIGHT, "STANDARD", java.awt.event.KeyEvent.KEY_LOCATION_STANDARD, "UNKNOWN", java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN)); sb.append(", actionKey=").append(esemény.isActionKey()); return sb; } /** Egérkurzor belépési értesítés. @param egérEsemény Az aktuális eseményobjektum. */ public void mouseEntered(java.awt.event.MouseEvent egérEsemény) { System.out.println(listáz(egérEsemény)); //információk kilistázása } /** Egérkurzor kilépési értesítés. @param egérEsemény Az aktuális eseményobjektum. */ public void mouseExited(java.awt.event.MouseEvent egérEsemény) { System.out.println(listáz(egérEsemény)); //információk kilistázása } /** Egérgomb lenyomási értesítés. @param egérEsemény Az aktuális eseményobjektum. */ public void mousePressed(java.awt.event.MouseEvent egérEsemény) { System.out.println(listáz(egérEsemény)); //információk kilistázása } /** Egérgomb felengedési értesítés. @param egérEsemény Az aktuális eseményobjektum. */ public void mouseReleased(java.awt.event.MouseEvent egérEsemény) { System.out.println(listáz(egérEsemény)); //információk kilistázása } /** Egérgomb megnyomási értesítés. @param egérEsemény Az aktuális eseményobjektum. */ public void mouseClicked(java.awt.event.MouseEvent egérEsemény) { System.out.println(listáz(egérEsemény)); //információk kilistázása } /** Egérmutatóval történő mozgatási értesítés. @param egérEsemény Az aktuális eseményobjektum. */ public void mouseDragged(java.awt.event.MouseEvent egérEsemény) { System.out.println(listáz(egérEsemény)); //információk kilistázása } /** Egérmutató mozgatási értesítés. @param egérEsemény Az aktuális eseményobjektum. */ public void mouseMoved(java.awt.event.MouseEvent egérEsemény) { System.out.println(listáz(egérEsemény)); //információk kilistázása } /** Egér események alapjellemzőinek listázása. @param esemény a fellépett egéresemény @param azonosítók azonosító konstansnevek és értékek @return az elkészített lista */ private StringBuilder listáz(java.awt.event.MouseEvent esemény, Object... azonosítók) { StringBuilder sb = new StringBuilder(256); if (azonosítók==null || azonosítók.length==0) //alap egéresemények sb.append(alaplistáz(esemény, "MOUSE", //azonosító konstansok "PRESSED", java.awt.event.MouseEvent.MOUSE_PRESSED, "RELEASED", java.awt.event.MouseEvent.MOUSE_RELEASED, "CLICKED", java.awt.event.MouseEvent.MOUSE_CLICKED, "ENTERED", java.awt.event.MouseEvent.MOUSE_ENTERED, "EXITED", java.awt.event.MouseEvent.MOUSE_EXITED, "DRAGGED", java.awt.event.MouseEvent.MOUSE_DRAGGED, "MOVED", java.awt.event.MouseEvent.MOUSE_MOVED)); else sb.append(alaplistáz(esemény, "MOUSE", azonosítók)); //görgetés sb.append("button=").append(kiválaszt(esemény.getButton(), "NOBUTTON", java.awt.event.MouseEvent.NOBUTTON,//egérgomb konstansok "BUTTON1", java.awt.event.MouseEvent.BUTTON1, "BUTTON2", java.awt.event.MouseEvent.BUTTON2, "BUTTON3", java.awt.event.MouseEvent.BUTTON3)); sb.append(", clickCount=").append(esemény.getClickCount());//kattintások sb.append(", popupTrigger=").append(esemény.isPopupTrigger()); sb.append(", x=").append(esemény.getX()); //egérkurzor koordináták sb.append(", y=").append(esemény.getY()); return sb; } /** Egérgomb görgetési értesítés. @param egérEsemény Az aktuális eseményobjektum. */ public void mouseWheelMoved(java.awt.event.MouseWheelEvent egérEsemény) { System.out.println(listáz(egérEsemény)); //információk kilistázása } /** Egérgomb görgetési események listázása. @param esemény a fellépett görgetési esemény @return az elkészített lista */ private StringBuilder listáz(java.awt.event.MouseWheelEvent esemény) { StringBuilder sb = new StringBuilder(256); sb.append(listáz(esemény, "WHEEL", //eseményazonosító java.awt.event.MouseEvent.MOUSE_WHEEL)).append("\n\t\t"); sb.append("scrollType=WHEEL_").append(kiválaszt(esemény.getScrollType(), "BLOCK", java.awt.event.MouseWheelEvent.WHEEL_BLOCK_SCROLL, "UNIT", java.awt.event.MouseWheelEvent.WHEEL_UNIT_SCROLL)) .append("_SCROLL"); //görgetés típusa sb.append(", wheelRotation=").append(esemény.getWheelRotation()); sb.append(", scrollAmount=").append(esemény.getScrollAmount()); //adatok sb.append(", unitsToScroll=").append(esemény.getUnitsToScroll()); return sb; } /** GUI-t felépítő konstruktor. @param felület a felhasználói felületet tartalmazó konténer */ EsemenyTeszt( java.awt.Container felület ) { felület.setLayout( new java.awt.BorderLayout() ); java.awt.Label tesztterület = new java.awt.Label( "Tesztterület billentyű- és egér eseményekhez", java.awt.Label.CENTER); felület.add(tesztterület); addAWTEventListener(this); //saját események figyelése java.awt.Toolkit.getDefaultToolkit().addAWTEventListener( this, java.awt.AWTEvent.WINDOW_EVENT_MASK); //ablakesemények figyelése tesztterület.setFocusable( true ); //fókuszbillentyűk tesztterület.setFocusTraversalKeysEnabled(false); //figyelése tesztterület.addKeyListener( this ); //billentyűzetesemények figyelése tesztterület.addMouseListener( this ); //egéresemények figyelése tesztterület.addMouseMotionListener( this ); tesztterület.addMouseWheelListener( this ); tesztterület.addHierarchyListener( this ); //megjelenés figyelése } /** 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 EsemenyTeszt( 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 java.awt.Frame("Eseményteszt"); felépít( ablak, argumentumok ); //felület felépítése ablak.pack(); //ablak méretezése ablak.setVisible(true); //és megjelenítése } }