001 /**
002 * @author Václav Mikolášek
003 * nicklaus@students.zcu.cz
004 */
005
006 package animace.panel;
007
008 import animace.*;
009 import javax.swing.*;
010 import javax.imageio.*;
011 import java.awt.*;
012 import java.awt.image.*;
013 import java.awt.event.*;
014 import java.io.*;
015 import java.util.*;
016
017 /**
018 * PicturePanel je vlastně jenom JLayeredPane, s nastaveným obrázkem na pozadí. Viz metoda paintComponent()
019 * Protože se předpokláda, že bude mít i objetky implementujicí rozhraní PaintControled
020 * je pretížena metoda paint(), tak aby zavolala objectPainted() a metoda add(), tak
021 * abychom získali kontrolu nad těmito objekty.
022 * Jinak se PicturePanel od JLayeredPaneu prakticky neliší.
023 */
024
025 public class PicturePanel extends JLayeredPane {
026 private BufferedImage background;
027 private ArrayList controledObjects = new ArrayList();
028 private PaintControl pc = new PaintControl();
029
030 /**
031 * Vytvoří PicturePanel s obrázkem na pozadí
032 * @param background obrázek, který bude na pozadí PicturePanelu
033 */
034 public PicturePanel(BufferedImage background) {
035 this.background = background;
036 init();
037 }
038
039 /**
040 * Vytvoří PicturePanel bez obrázku.
041 */
042 public PicturePanel() {
043 this.background = null;
044 init();
045 }
046
047 /**
048 * Nedělá nic jiného, než že pokud je nastaven obrázek pozadí, tak jej
049 * nakreslí.
050 */
051 public void paintComponent(Graphics g)
052 {
053 if (background != null)
054 g.drawImage(background,0,0,null);
055 else {
056 g.setColor(Color.white);
057 g.fillRect(0, 0, getWidth(), getHeight());
058 }
059 }
060
061 /**
062 * Volá rovnou <tt>super.paint</tt>,a poté "řekne" všem PaintControled objektům,
063 * že byly nakresleny, to se porvede voláním metody objectPainted() nad jejich paintControlery.
064 */
065 public void paint(Graphics g) {
066 super.paint(g);
067 for(Iterator it = controledObjects.iterator(); it.hasNext(); ((PaintControled)it.next()).getPaintControl().objectPainted());
068 }
069
070 /**
071 * Inicializace PicturePanelu, nastaví layout na FlowLayout, bez čehož
072 * by se vůbec nic nezobrazilo. A nastaví hodnotu opaque na true,
073 * protože obrázek na pozadí není průhledný a dosáhneme tím urychlení.
074 */
075 public void init() {
076 setLayout(new FlowLayout());
077 setOpaque(true);
078 }
079
080 /**
081 * Překrytí zdědené metody add(Componnet c, int num), abychom získali kontrolu nad objekty, které
082 * jsou PaintControled
083 */
084 public void add(Component c, Object num) {
085 if (c instanceof PaintControled) {
086 controledObjects.add(c);
087 }
088 super.add(c,num);
089 }
090
091 /**
092 * Nastaví obrázek pozadí na <tt>background</tt>
093 */
094 public void setBackground(BufferedImage background) {
095 this.background = background;
096 }
097 }