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.io.*;
014    
015    /**
016     * Třída PictureButton umožňuje vytvorit tlačítko s libovolnou grafickou
017     * podobou. Pokud se divíte, že nikde neimplementuje metody z rozhraní Moveable
018     * tak je to proto, že dědí od JButtonu, kde jsou tyto metody již naimplementovany
019     */
020    public class PictureButton extends JButton implements Moveable, PaintControled {
021            private BufferedImage img;
022            private PaintControl pc = null;
023            
024            
025            /**
026             * Konstruktor vytvoří tlačítko s obrázkem.
027             * @param img obrazek, který nahradí implicitní grafickou podobu tlačítka
028             */
029            public PictureButton(BufferedImage img) {
030                    this.img = img;
031                    init();
032                    
033            
034            }
035            private void init() {
036                    setBorder(null);                //aby nemel obrazek oramovani, ktere je impicitne u JButtonu nastevno
037                    setOpaque(false);               //DULEZITE - opet implictine nastaveno na true, nutne zmenit (u JButtonu), aby nevznikal za PictureButtonem "neporadek"
038                    setPreferredSize(new Dimension(img.getWidth(),img.getHeight())); 
039            }
040            
041            /**
042             * U Swing komponent je nevhodne překrývat metodu paint(Graphics g). Grafickou podobu tlačítka
043             * nastavíme v metodě paintComponent(Graphics g);
044             */
045            public void paintComponent(Graphics g) {
046                    g.drawImage(img,0,0,img.getWidth(),img.getHeight(),null);
047            }
048            
049            /**
050             * Metoda z rozhraní PaintControled
051             */
052            public void setPaintControl(PaintControl pc) {
053                    this.pc = pc;
054            }
055            
056            /**
057             * Metoda z rozhraní PaintControled
058             */
059            public PaintControl getPaintControl() {
060                    return pc;
061            }
062    }