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 }