Source code: com/arranger/jarl/test/PanelTest2.java
1 package com.arranger.jarl.test;
2
3 import com.arranger.jarl.Jarl;
4 import com.arranger.jarl.base.IContext;
5 import com.arranger.jarl.util.ImageUtil;
6
7 import javax.swing.*;
8 import javax.swing.event.ChangeEvent;
9 import javax.swing.event.ChangeListener;
10 import java.awt.*;
11 import java.awt.event.*;
12 import java.awt.geom.AffineTransform;
13 import java.awt.geom.Point2D;
14 import java.awt.geom.Rectangle2D;
15
16 /**
17 * PanelTest2 created on Mar 3, 2003
18 */
19 public class PanelTest2 extends JPanel {
20
21 protected JLabel m_imageLabel;
22 protected JTextField m_configFile;
23
24 protected int m_imageWidth = 250;
25 protected int m_imageHeight = 250;
26 protected Jarl m_jarl;
27 protected Image m_renderedImage;
28 protected int m_frameToRender = 0;
29 protected JSlider m_framesPerSecond;
30 protected JButton m_renderButton;
31
32 public void refresh() {
33 invalidate();
34 m_frame.setSize(m_imageWidth + 250, m_imageHeight + 120);
35 Component [] components = getComponents();
36 for (int index = 0; index < components.length; index++) {
37 components[index].invalidate();
38 }
39 m_imageLabel.invalidate();
40
41 validate();
42 }
43
44 public PanelTest2() {
45 m_configFile = new JTextField(20) {
46 public Dimension getPreferredSize() {
47 return new Dimension(100, 20);
48 }
49
50 public Dimension getMinimumSize() {
51 return getPreferredSize();
52 }
53
54 public Dimension getMaximumSize() {
55 return getPreferredSize();
56 }
57 };
58 m_configFile.setText("<enter config file>");
59
60
61 JLabel sliderLabel = new JLabel("Frames Per Second", JLabel.CENTER);
62 sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
63
64 m_framesPerSecond = new JSlider(JSlider.HORIZONTAL, 0, 100, 0);
65 m_framesPerSecond.addChangeListener(new SliderListener());
66
67 //Turn on labels at major tick marks.
68 m_framesPerSecond.setMajorTickSpacing(25);
69 m_framesPerSecond.setPaintTicks(true);
70 m_framesPerSecond.setPaintLabels(true);
71 m_framesPerSecond.setBorder(BorderFactory.createEmptyBorder(0,0,10,0));
72
73
74 m_renderButton = new JButton(" Render ");
75 m_renderButton.setMnemonic(KeyEvent.VK_R);
76 m_renderButton.addActionListener(new ActionListener() {
77 public void actionPerformed(ActionEvent e) {
78 try {
79 m_jarl = new Jarl();
80 m_jarl.init(m_configFile.getText());
81
82 IContext context = m_jarl.getContext();
83 m_imageWidth = context.getWidth();
84 m_imageHeight = context.getHeight();
85
86 int max = m_jarl.getEndTime().getFrame();
87 m_framesPerSecond.setMaximum(max);
88 m_framesPerSecond.setMajorTickSpacing(max / 4);
89 m_renderedImage = m_jarl.getRenderManager().renderOneFrame(context, m_frameToRender);
90 refresh();
91 } catch (Throwable exc) {
92 JOptionPane.showMessageDialog(PanelTest2.this, exc.getMessage());
93 }
94 }
95 });
96 m_renderButton.setAlignmentX(Component.CENTER_ALIGNMENT);
97
98 m_imageLabel = new JLabel() {
99 public Dimension getPreferredSize() {
100 return new Dimension(m_imageWidth + 20, m_imageHeight + 20);
101 }
102
103 public Dimension getMinimumSize() {
104 return getPreferredSize();
105 }
106
107 public Dimension getMaximumSize() {
108 return getPreferredSize();
109 }
110
111 protected void paintComponent(Graphics g) {
112 if (m_renderedImage != null) {
113 ImageUtil.overlayTransparentImage(g, m_renderedImage);
114 } else {
115 super.paintComponent(g);
116 }
117 }
118 };
119 m_imageLabel.setVerticalAlignment(SwingConstants.CENTER);
120 m_imageLabel.setHorizontalAlignment(SwingConstants.CENTER);
121
122 JPanel leftPanel = new JPanel();
123 leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
124 leftPanel.setBorder(BorderFactory.createCompoundBorder(
125 BorderFactory.createTitledBorder("Jarl config file"),
126 BorderFactory.createEmptyBorder(10, 10, 10, 10)));
127 leftPanel.add(m_configFile);
128 leftPanel.add(Box.createRigidArea(new Dimension(0, 10)));
129 leftPanel.add(m_framesPerSecond);
130 leftPanel.add(m_renderButton);
131
132 JPanel rightPanel = new JPanel();
133 rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
134 rightPanel.setBorder(BorderFactory.createCompoundBorder(
135 BorderFactory.createTitledBorder("Rendered Image"),
136 BorderFactory.createEmptyBorder(10, 10, 10, 10)));
137 rightPanel.add(m_imageLabel);
138
139 setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
140 setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
141 add(leftPanel);
142 add(Box.createRigidArea(new Dimension(10, 0)));
143 add(rightPanel);
144 }
145
146 protected Shape centerShape(Shape shape, JComponent component) {
147 Point2D centerPoint = new Point2D.Double(component.getWidth() / 2.0, component.getHeight() / 2.0);
148 Rectangle2D rectangle2D = shape.getBounds2D();
149 double x = centerPoint.getX() - (rectangle2D.getWidth() / 2.0) - rectangle2D.getX();
150 double y = centerPoint.getY() - (rectangle2D.getHeight() / 2.0) - rectangle2D.getY();
151 AffineTransform affineTransform = AffineTransform.getTranslateInstance(x, y);
152 return affineTransform.createTransformedShape(shape);
153 }
154
155 class SliderListener implements ChangeListener {
156 public void stateChanged(ChangeEvent e) {
157 JSlider source = (JSlider)e.getSource();
158 if (!source.getValueIsAdjusting()) {
159 m_frameToRender = source.getValue();
160 m_renderButton.setText("Render frame: " + m_frameToRender);
161 }
162 }
163 }
164
165 protected static JFrame m_frame;
166
167 public static void main(String args[]) {
168 m_frame = new JFrame("Jarl Runner");
169
170 m_frame.addWindowListener(new WindowAdapter() {
171 public void windowClosing(WindowEvent e) {
172 System.exit(0);
173 }
174 });
175
176 m_frame.getContentPane().add(new PanelTest2());
177 m_frame.pack();
178 m_frame.setVisible(true);
179 }
180 }