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    }