All pastes #2054952 Raw Edit

Anonymous

public text v1 · immutable
#2054952 ·published 2011-05-07 20:00 UTC
rendered paste body
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Platno je trida, ktera umoznuje vykreslovani jednoduchych geometrickych tvaru.
 * 
 * @author: Michael Bazant
 *
 */
public class Platno {
    // Tato trida je pomerne komplexni z duvodu zachovani jednoducheho a
    // prehledneho rozhrani a atributu trid tvaru, coz je vhodne pro vyukove
    // ucely.
    

    private static Platno platnoSingleton;

    /**
     * Tovarni staticka metoda k vytvoreni platna (singleton).
     */
    public static Platno getPlatnoSingleton() {
        if (platnoSingleton == null) {
            platnoSingleton = new Platno("Aplikace pro praci s jednoduchymi" +
                    "geometrickymi tvary", 300, 300, Color.white);
        }
        platnoSingleton.setZobrazeno(true);
        return platnoSingleton;
    }
    //  ----- Cast vztahujici se k instancim tridy -----
    private JFrame oknoAplikace;
    private PanelPlatno panelPlatno;
    private Graphics2D grafika;
    private Color barvaPozadi;
    private Image obrazekPlatna;
    private List<Object> objekty;
    private HashMap<Object, IdentifikaceTvaru> tvary;

    /**
     * Konstruktor pro vytvoreni objektu platno.
     * @param nazev    nazev, ktery je zobrazen v zahlavi okna aplikace
     * @param sirka    pozadovana sirka platna
     * @param height   pozadovana vyska platna
     * @param barvaPozadi pozadovana barva pozadi platna
     */
    private Platno(String nazev, int sirka, int vyska, Color barvaPozadi) {
        oknoAplikace = new JFrame();
        panelPlatno = new PanelPlatno();
        oknoAplikace.setContentPane(panelPlatno);
        oknoAplikace.setTitle(nazev);
        panelPlatno.setPreferredSize(new Dimension(sirka, vyska));
        this.barvaPozadi = barvaPozadi;
        oknoAplikace.pack();
        objekty = new ArrayList<Object>();
        tvary = new HashMap<Object, IdentifikaceTvaru>();
    }

    /**
     * Tato metoda nastavi viditelnost a zobrazi platno na popredi. Muze byt
     * rovnez pouzita pro presun jiz zobrazeneho platna na popredi (pred
     * okna jinych aplikaci).
     * @param jeZobrazeno  hodnota typu boolean vyjadrujici zda je platno
     * zobrazeno (true nebo false).
     */
    public void setZobrazeno(boolean jeZobrazeno) {
        if (grafika == null) {
            // prvni zavolani metody: vytvoreni skryteho obrazku a jeho
            // vyplneni barvou pozadi
            Dimension rozmer = panelPlatno.getSize();
            obrazekPlatna = panelPlatno.createImage(rozmer.width, rozmer.height);
            grafika = (Graphics2D) obrazekPlatna.getGraphics();
            grafika.setColor(barvaPozadi);
            grafika.fillRect(0, 0, rozmer.width, rozmer.height);
            grafika.setColor(Color.black);
        }
        oknoAplikace.setVisible(jeZobrazeno);
    }

    /**
     * Meotda pro vykresleni tvaru na platno.
     * @param  referenceNaObjekt  reference na objekt
     * @param  barva            barva tvaru
     * @param  tvar            tvar, ktery bude vykreslen na platno
     */

    public void draw(Object referenceNaObjekt, String barva, Shape tvar) {
        objekty.remove(referenceNaObjekt);   // pouze v pripade ze jiz je v seznamu
        objekty.add(referenceNaObjekt);      // pridej na konec seznamu
        tvary.put(referenceNaObjekt, new IdentifikaceTvaru(tvar, barva));
        prekresli();
    }

    /**
     * Vymaze zadany objekt z obrazovky
     * @param  referenceNaObjekt tvar k vymazani z obrazovky
     */
    public void vymaz(Object referenceObject) {
        objekty.remove(referenceObject);   // pouze pokud ze jiz v seznamu
        tvary.remove(referenceObject);
        prekresli();
    }

    /**
     * Nastavi barvu tvaru
     * @param  barva   nova barva tvaru
     */
    public void setBarva(String barva) {
        if (barva.equals("cervena")) {
            grafika.setColor(Color.red);
        } else if (barva.equals("cerna")) {
            grafika.setColor(Color.black);
        } else if (barva.equals("modra")) {
            grafika.setColor(Color.blue);
        } else if (barva.equals("zluta")) {
            grafika.setColor(Color.yellow);
        } else if (barva.equals("zelena")) {
            grafika.setColor(Color.green);
        } else if (barva.equals("bila")) {
            grafika.setColor(Color.white);
        } else {
            grafika.setColor(Color.black);
        }
    }

    /**
     * cekej
     * Cekani po stanoveny pocet milisekund pred dokoncenim.
     * Poskytuje snadny zpusob pro dosazeni jednoduche animace pohybu objektu.
     * @param  milisekund  pocet
     */
    public void cekej(int milisekund) {
        try {
            Thread.sleep(milisekund);
        } catch (Exception e) {
            // vyjimky zatim neresime
        }
    }

    /**
     * Prekresli vsechny tvary umistene na platne.
     */
    private void prekresli() {
        vymaz();
        for (Object shape : objekty) {
            tvary.get(shape).draw(grafika);
        }
        panelPlatno.repaint();
    }

    /**
     * Vymaze cele platno. (Bez prekresleni.)
     */
    private void vymaz() {
        Color puvodniBarva = grafika.getColor();
        grafika.setColor(barvaPozadi);
        Dimension velikostPlatna = panelPlatno.getSize();
        grafika.fill(new Rectangle(0, 0, velikostPlatna.width, velikostPlatna.height));
        grafika.setColor(puvodniBarva);
    }

    /************************************************************************
     * Vnitrni trida PanelPlatno -komponenta platna obsazena v ramci
     * Platno. Jedna o zakladni JPanel s pridanou funkcnosti v podobe
     * prekresleni obrazku vlozeneho na platno.
     */
    private class PanelPlatno extends JPanel {

        @Override
        public void paint(Graphics g) {
            g.drawImage(obrazekPlatna, 0, 0, null);
        }
    }

    /************************************************************************
     * Vnitrni trida IdentifikaceTvaru - obsahuje zakladni informace o tvaru
     */
    private class IdentifikaceTvaru {

        private Shape tvar;
        private String oznaceniBarvy;

        public IdentifikaceTvaru(Shape tvar, String barva) {
            this.tvar = tvar;
            oznaceniBarvy = barva;
        }

        public void draw(Graphics2D graphic) {
            setBarva(oznaceniBarvy);
            graphic.fill(tvar);
        }
    }
}