rendered paste bodyimport 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);
}
}
}