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
}
}