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