package elte.java2_utikalauz5.gui; /** Képernyőn mászkáló kukacszerű egyszerű animáció megvalósítása nehézsúlyú ({@code Canvas}) grafikus komponenssel.
Az offscreen rajzolás megvalósítása {@code BufferStrategy} felhasználásával történik. @link.forrásfájl {@docRoot}/../data/gui/src CanvasPaintTeszt.java @link.letöltés {@docRoot}/../data/gui CanvasPaintTeszt.jar @see PaintTeszt @see java.awt.image.BufferStrategy @since Java 2 Útikalauz programozóknak 5.0 */ class CanvasPaintTeszt extends java.awt.Canvas { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Kukacanimálást végző objektum */ private PaintTeszt teszt; /** offscreen rajzolás elvégzését előíró jelző */ private boolean offscreen; /** Konstruktor az offscreen rajzolás előírásával. @param offscreen offscreen rajzolás elvégzését előíró jelző */ CanvasPaintTeszt(boolean offscreen) { this.offscreen = offscreen; //offscreen mód eltárolása teszt = new PaintTeszt(this); //animáció létrehozása és indítása } /** 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; } /** offscreen rajzoláshoz felhasznált háttértár */ private java.awt.image.BufferStrategy buffer; /** 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) { java.awt.Graphics újg = g; if (offscreen) { //offscreen esetén új környezet kérése if (buffer==null) { //ha még nincs puffer, akkor létrehozzuk createBufferStrategy(2); buffer = getBufferStrategy(); } while(true) { //érvényes rajzolási környezetre várunk újg = buffer.getDrawGraphics(); if (buffer.contentsLost()) újg.dispose(); else break; } if (!buffer.contentsRestored()) //törölt környezet esetén nem kell újg.setClip(g.getClip()); //a vágóterületet átvenni } return újg; } /** 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("CanvasPaintTeszt paint", true, false, actg); if (offscreen) { actg.dispose();//offscreen esetén ha nem sikerült, újra próbálni if (buffer.contentsLost()) continue; buffer.show(); //háttértár kirajzolása } 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 java.awt.Graphics actg = getGraphics( g ); teszt.pontoz("CanvasPaintTeszt update", offscreen && buffer. contentsRestored(), true, actg ); //csak az új pontok kellenek if (offscreen) { actg.dispose();//offscreen esetén ha nem sikerült, újra próbálni if (buffer.contentsLost()) continue; buffer.show(); //háttértár kirajzolása } break; } System.out.println("\tidőtartam: "+(System.nanoTime() - idő)+" ns."); } /** 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[]) { CanvasPaintTeszt teszt = new CanvasPaintTeszt(argumentumok.length>0 && "offscreen".equalsIgnoreCase(argumentumok[0])); felület.setLayout( new java.awt.BorderLayout() ); felület.add( teszt ); felület.setPreferredSize(new java.awt.Dimension(400, 300)); } /** A tesztprogram indítása. Egyetlen értelmezett paraméter az {@code offscreen} amely az offscreen rajzolási technika alkalmazását írja elő. @param argumentumok Az indításkor megadott paraméterek. */ public static void main( String argumentumok[] ) { java.awt.Frame keret=new AblakTeszt.Ablak("CanvasPaintTeszt");//Fő ablak felépít( keret, argumentumok ); //GUI felépítése keret.setVisible(true); //felület megjelenítése } }