001 /**
002 * @author Václav Mikolášek
003 * nicklaus@students.zcu.cz
004 */
005
006 package animace.label;
007
008 import animace.*;
009 import javax.swing.*;
010 import java.awt.*;
011 import java.awt.image.*;
012 import java.awt.event.*;
013
014 /**
015 * TestLabel ukazuje použití připravených tříd PictureLabel a MoveablePicture
016 * Všiměte si, jak se v metodě initPictures() registruje posluchač udalostí,
017 * která reprezentuje kliknutí na MoveablePicture. Je to stejný postup jako
018 * u standardních AWT.Component.
019 */
020 public class TestLabel {
021 private static JFrame frame;
022 private static PictureLabel scr;
023 private static MoveablePicture[] mPictures = new MoveablePicture[0];
024
025 /**
026 * Rozeběhne test
027 */
028 public static void main(String[] args) {
029 if (args.length > 0) {
030 try {
031 mPictures = new MoveablePicture[Integer.valueOf(args[0]).intValue()];
032 }
033 catch (NumberFormatException e) {
034 System.out.println("Parametrem je pocet obrazku");
035 System.exit(1);
036 }
037 }
038 initFrame();
039 initPictures();
040 frame.setVisible(true);
041 }
042
043 /**
044 * Inicializační metoda pro okno a obrázky. Obrázek na pozadí se tahá z ImageSource
045 */
046 private static void initFrame() {
047 frame = new JFrame("Test PictureLabelu - vlastni obrazky");
048
049 JTextArea napoveda = new JTextArea();
050 napoveda.setFont(new Font("Arial Bold", Font.PLAIN,12));
051 napoveda.setBorder( new javax.swing.plaf.BorderUIResource.BevelBorderUIResource(1));
052 napoveda.setEditable(false);
053 napoveda.setText(" Nápověda:\n"+
054 " Stisknutím kláves F1 az F12 uvedete do pohybu nebo zastavíte\n" +
055 " obrázky s odpovídajícím pořadovým číslem. Kliknutím na konkrétní\n"+
056 " obrázek zobrazíte okénko s údaji o jeho číslu, FPS,\n"+
057 " celkovém počtu snímku a počtu posunů");
058
059 /// Obrazek na pozadi :
060 BufferedImage bg = ImageSource.square1(Color.red.darker(),Color.red.darker().darker());
061
062 /// PictureLabel :
063 scr = new PictureLabel(bg);
064
065 ///nastaveni okna
066 Container c = frame.getContentPane();
067 c.setLayout(new BorderLayout());
068 c.add(scr,BorderLayout.CENTER);
069 c.add(napoveda,BorderLayout.SOUTH);
070 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
071 frame.setSize(400,450);
072 scr.setPreferredSize(new Dimension(400,400));
073 }
074
075 /**
076 * Vytvoří instance třídy MoveablePicture, zaregistruje jim posluchače na kliknutí
077 * a dá je na PictureLabel.
078 */
079 private static void initPictures() {
080 for (int i = 0; i < mPictures.length; i++) {
081 mPictures[i] = new MoveablePicture(scr,ImageSource.javaLogo());
082 mPictures[i].setPaintControl(new PaintControl());
083 ///
084 /// ZDE SI ZAREGISTRUJEME POSLUCHACE :
085 ///
086 mPictures[i].addActionListener(new MPictureActionListener("F"+(i+1)));
087
088 /// dame MoveablePicture na PicturePanel
089 scr.addMoveablePicture(mPictures[i]);
090 scr.getInputMap(scr.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F1 + i,0),"F"+(i+1));
091 scr.getActionMap().put("F"+(i+1),new MoveablePictureKeyAction(mPictures[i]));
092 }
093 scr.doMPLayout();
094 }
095
096 /**
097 * AbstractAction starající se o rozběhnutí požadovaného obrázku
098 * po stisku klávesy F1 az F12, podle počtu obrázku.
099 */
100 public static class MoveablePictureKeyAction extends AbstractAction {
101 private MoveablePicture mp = null;
102 private Driver driver = null;
103
104 /**
105 * Konstruktor vyžaduje objekt typu MoveablePicture
106 * pro který bude vytvářet vlákno Driver
107 */
108 public MoveablePictureKeyAction(MoveablePicture mp) {
109 this.mp = mp;
110 }
111
112 /**
113 * Po stisku klávesy F(X) se provede test, zda je objekt již v pohybu,
114 * potom je pozastaven, v opačném případě se inicializuje vlákno Driver
115 * pro tento objekt a je spuštěno.
116 */
117 public void actionPerformed(ActionEvent e) {
118 if (driver != null && driver.goes()) {
119 driver.stopDriving();
120 }
121 else {
122 PictureLabel c = (PictureLabel) e.getSource();
123 driver = new Driver(mp,0,0,c.getWidth() - mp.getWidth(),c.getHeight()-mp.getHeight());
124 driver.setPaintControl(((PaintControled) mp).getPaintControl());
125 driver.start();
126 }
127 }
128 }
129
130 /**
131 * MPictureActionListener způsobí, že po kliknutí na MoveablePicture
132 * bude otevřeno okno s některými informacemi o objektu.
133 */
134 public static class MPictureActionListener implements ActionListener {
135 private JFrame infoFrame = null;
136 private JLabel nameVal;
137 private JLabel name = new JLabel(" Tlacitko:",JLabel.LEFT);;
138 private JLabel fps = new JLabel(" FPS:",JLabel.LEFT);
139 private JLabel frames = new JLabel(" Snimku:",JLabel.LEFT);
140 private JLabel movesCount = new JLabel(" Posun o:",JLabel.LEFT);
141 private JLabel movesCountNum = new JLabel("",JLabel.LEFT);
142 private JLabel fpsNum = new JLabel("",JLabel.LEFT);
143 private JLabel framesNum = new JLabel("",JLabel.LEFT);
144
145
146
147 public MPictureActionListener(String name) {
148 this.nameVal = new JLabel(" " + name, JLabel.LEFT);
149 initInfoFrame();
150 }
151
152 /// Nastavi podobu okna
153 private void initInfoFrame() {
154 infoFrame = new JFrame();
155 Container c = infoFrame.getContentPane();
156 c.setLayout(new GridLayout(0,2));
157 c.add(name);
158 c.add(nameVal);
159 c.add(fps);
160 c.add(fpsNum);
161 c.add(frames);
162 c.add(framesNum);
163 c.add(movesCount);
164 c.add(movesCountNum);
165
166 c.setBackground(Color.gray.brighter());
167 }
168
169 /**
170 * Když uživatel klikne na MoveablePicture, provede se tato obsluha, která
171 * otevře okno s některými informacemi o objektu. Jméno, FPS, Počet snímků a počet
172 * vykonaných posunů.
173 */
174 public void actionPerformed(ActionEvent e)
175 {
176
177 MoveablePicture mp = (MoveablePicture) e.getSource();
178
179 fpsNum.setText(" " + Math.round(mp.getPaintControl().getAverageFps()));
180 framesNum.setText(" " + mp.getPaintControl().framesCount);
181 movesCountNum.setText(" " + mp.getPaintControl().movesCount);
182 infoFrame.pack();
183 if (infoFrame.isVisible()) {
184 infoFrame.validate();
185 }
186 else {
187 infoFrame.setVisible(true);
188 }
189 }
190 }
191 }