package elte.java2_utikalauz5.applet; /** Képernyőn mászkáló kukacszerű egyszerű animáció megvalósítása appletben.

Az offscreen rajzolás megvalósítása {@code VolatileImage} felhasználásával történik. @link.forrásfájl {@docRoot}/../data/applet/src AppletPaintTeszt.java @link.letöltés {@docRoot}/../data/applet AppletPaintTeszt.jar @see elte.java2_utikalauz5.gui.PaintTeszt @see java.awt.image.VolatileImage @since Java 2 Útikalauz programozóknak 5.0 */ public class AppletPaintTeszt extends java.applet.Applet { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Applet leírása @return Az applet leírása */ @Override public String getAppletInfo() { return "Képernyőn mászkáló kukacszerű egyszerű animáció"; } /** Applet indítási paramétereinek leírása @return Az appletparaméterek leírása */ @Override public String[][] getParameterInfo() { String info[][]={ {"offscreen", "nem null", "offscreen rajzolás kérése"}}; return info; } /** Kukacanimátor objektum */ private transient elte.java2_utikalauz5.gui.PaintTeszt teszt; /** offscreen rajzolás elvégzését előíró jelző */ private transient boolean offscreen; /** Offscreen rajzolás alkalmazásának lekérdezése. @return igaz, ha offscreen technológiával történik a megjelenítés */ @Override public boolean isDoubleBuffered() { return offscreen; } /** A teljes kukac újrarajzoltatása */ private transient boolean mind; /** offscreen rajzoláshoz felhasznált háttértár */ private transient java.awt.image.VolatileImage buffer; /** Grafikus környezet gyorsítótárazása */ private transient java.awt.Graphics újg; /** A megjelenítéshez használható grafikus környezet megszerzése. @param g A megjelenítő metódus eredeti grafikus környezete. @return A felhasználandó rajzolási környezet, mely normál esetben megegyezik a bemenő paraméterrel, csak offscreen technika esetén kapunk mást. */ private java.awt.Graphics getGraphics(java.awt.Graphics g) { if (offscreen) { boolean új = buffer==null || //képpuffert újra kell kreálni? buffer.getWidth()!=getWidth()|| buffer.getHeight()!=getHeight(); if (!új) { int státusz = buffer.validate(getGraphicsConfiguration()); if (státusz==java.awt.image.VolatileImage.IMAGE_INCOMPATIBLE) új = true; //érvénytelen a képpuffer tartalma else mind |= //elveszett a képpuffer tartalma státusz==java.awt.image.VolatileImage.IMAGE_RESTORED; } if (új) { //új képpuffer létrehozása buffer = createVolatileImage(getWidth(), getHeight()); mind = true; //teljes kukacrajzolás if (újg!=null) újg.dispose(); //grafikus környezet gyorsítótára újg = buffer.getGraphics(); } if (mind) újg.setClip(null); //vágási terület beállítása else újg.setClip(g.getClip()); return újg; } return g; //nincs képpufferezés } /** Az animáció aktuális állapotának teljes megjelenítése. @param g A felhasználandó eredeti grafikus környezet. */ @Override public void paint( java.awt.Graphics g ) { long idő = System.nanoTime(); //időmérés milliárdod másodpercben while(true) { //offscreen esetén addig ismételni, amíg végre sikerül java.awt.Graphics actg = getGraphics( g ); //minden pont megjelenik teszt.pontoz("paint", true, false, actg); if (offscreen) { //offscreen esetén if (buffer.contentsLost()) continue;//ha nem siker,újra próbálni java.awt.Rectangle vágás = actg.getClipBounds(); if (vágás==null) g.drawImage(buffer, 0, 0, this);//teljes puffer else { //csak az érintett képrész újrarajzolása int x1 = vágás.x; int y1 = vágás.y; int x2 = vágás.x+vágás.width; int y2 = vágás.y+vágás.height; g.drawImage(buffer, x1, y1, x2, y2, x1, y1, x2, y2, this); } } break; } System.out.println("\tidőtartam: "+(System.nanoTime() - idő)+" ns."); } /** Az animáció aktuális állapotának növekményes megjelenítése. @param g A felhasználandó eredeti grafikus környezet. */ @Override public void update( java.awt.Graphics g ) { long idő = System.nanoTime(); //időmérés milliárdod másodpercben while(true) { //offscreen esetén addig ismételni, amíg végre sikerül mind = false; //csak a változást kell kirajzolni java.awt.Graphics actg = getGraphics( g ); teszt.pontoz("update", mind, true, actg ); if (offscreen) { //offscreen esetén if (buffer.contentsLost()) continue;//ha nem siker,újra próbálni java.awt.Rectangle vágás = actg.getClipBounds(); if (vágás==null) g.drawImage(buffer, 0, 0, this);//teljes puffer else { //csak az érintett képrész újrarajzolása int x1 = vágás.x; int y1 = vágás.y; int x2 = vágás.x+vágás.width; int y2 = vágás.y+vágás.height; g.drawImage(buffer, x1, y1, x2, y2, x1, y1, x2, y2, this); } } break; } System.out.println("\tidőtartam: "+(System.nanoTime() - idő)+" ns."); } /** Applet inicializálása */ @Override public void init() { offscreen = getParameter("offscreen")!=null; //paraméterátvétel teszt = new elte.java2_utikalauz5.gui.PaintTeszt(this); } /** Applet indítása */ @Override public void start() { teszt.start(); //kukacmozgatás indítása } /** Applet megállítása */ @Override public void stop() { teszt.stop(); //kukacmozgatás megállítása } /** Applet megszüntetése */ @Override public void destroy() { if (teszt!=null) teszt.stop(); //kukacmozgatás megszüntetése teszt = null; } }