package elte.java2_utikalauz5.gui;
/**
Képernyőn mászkáló kukacszerű egyszerű animáció megvalósítása pehelysúlyú
({@code Component}) grafikus komponenssel.

Az offscreen rajzolás megvalósítása memóriában felépített {@code Image}
felhasználásával történik.
@link.forrásfájl {@docRoot}/../data/gui/src PehelyPaintTeszt.java
@link.letöltés {@docRoot}/../data/gui PehelyPaintTeszt.jar
@see PaintTeszt
@see java.awt.Image
@since Java 2 Útikalauz programozóknak 5.0
*/
class PehelyPaintTeszt extends java.awt.Component {
/** 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ő
*/
PehelyPaintTeszt(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;
}
/**
Nem átlátszó a komponens.
@return igaz
*/
@Override
public boolean isOpaque() {
return true;
}
/** offscreen rajzoláshoz felhasznált háttértár */
private java.awt.Image buffer;
/** offscreen rajzoláshoz felhasznált környezet */
private 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) { //offscreen esetén a memóriában levő képre rajzolunk
if (buffer==null || buffer.getWidth(this)!=getWidth() || //szükség
buffer.getHeight(this)!=getHeight()) {//esetén új memóriakép
buffer = createImage(getWidth(), getHeight()); //létrehozása
if (újg != null) újg.dispose(); //régi környezet felszabadítása
újg = buffer.getGraphics(); //új rajozlási környezet beállítása
((java.awt.Graphics2D)újg).setBackground( //háttérszín átvétele
getBackground());
}
újg.setClip(g.getClip()); //vágóterület átvétele
return újg;
}
return g; //eredeti rajzolási környezet visszaadása
}
/**
Az animáció aktuális állapotának 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
java.awt.Graphics actg = getGraphics( g ); //rajzolási körznyezet kérése
java.awt.Rectangle vágás = actg.getClipBounds(); //ténylegesen érintett
actg.clearRect(vágás.x, vágás.y, vágás.width, vágás.height); //területek
teszt.pontoz("PehelyPaintTeszt paint", true, false, actg );//kirajzolása
if (offscreen) {
int x1 = vágás.x;
int y1 = vágás.y; //offscreen buffer
int x2 = vágás.x+vágás.width; //érintett területének
int y2 = vágás.y+vágás.height; //megjelenítése
g.drawImage(buffer, x1, y1, x2, y2, x1, y1, x2, y2, this);
}
System.out.println("\tidőtartam: "+(System.nanoTime() - idő)+" ns.");
}
/**
Az animáció aktuális állapotának megjelenítése.
Ezt a metódust csak az AWT korábbi verziói hívták meg.
@param g A felhasználandó eredeti grafikus környezet.
*/
@Override
public void update( java.awt.Graphics g ) {
System.out.println("PehelyPaintTeszt update???"); //nem kéne meghívódnia
super.update( g );
}
/**
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[]) {
PehelyPaintTeszt teszt = new PehelyPaintTeszt(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("Pehelysúlyú PaintTeszt");
felépít( keret, argumentumok ); //GUI felépítése
keret.setVisible(true); //felület megjelenítése
}
}