TimePanel.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package ui.view;
  2. import java.awt.BorderLayout;
  3. import java.awt.FlowLayout;
  4. import java.awt.Image;
  5. import java.awt.Point;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.awt.event.KeyEvent;
  9. import java.awt.event.MouseAdapter;
  10. import java.awt.event.MouseEvent;
  11. import java.awt.event.MouseListener;
  12. import java.io.IOException;
  13. import javax.swing.AbstractAction;
  14. import javax.swing.ImageIcon;
  15. import javax.swing.JButton;
  16. import javax.swing.JLabel;
  17. import javax.swing.JPanel;
  18. import javax.swing.JSlider;
  19. import javax.swing.KeyStroke;
  20. import javax.swing.Timer;
  21. import javax.swing.event.ChangeEvent;
  22. import javax.swing.event.ChangeListener;
  23. import javax.swing.plaf.basic.BasicSliderUI;
  24. import ui.controller.Control;
  25. import ui.model.Model;
  26. /**
  27. * This Class represents a Panel where the User can start and stop the
  28. * Simulation. He Can also reset the Simulation and click through every
  29. * Iteration.
  30. *
  31. * @author Gruppe14
  32. */
  33. public class TimePanel extends JPanel {
  34. private Model model;
  35. private Control controller;
  36. JSlider timeSlider = new JSlider() {
  37. {
  38. // Make the slider jump to mouse position on left click
  39. MouseListener[] listeners = getMouseListeners();
  40. for (MouseListener l : listeners)
  41. removeMouseListener(l); // remove UI-installed TrackListener
  42. final BasicSliderUI ui = (BasicSliderUI) getUI();
  43. BasicSliderUI.TrackListener tl = ui.new TrackListener() {
  44. // this is where we jump to absolute value of click
  45. @Override
  46. public void mouseClicked(MouseEvent e) {
  47. Point p = e.getPoint();
  48. int value = ui.valueForXPosition(p.x);
  49. setValue(value);
  50. }
  51. // disable check that will invoke scrollDueToClickInTrack
  52. @Override
  53. public boolean shouldScroll(int dir) {
  54. return false;
  55. }
  56. };
  57. addMouseListener(tl);
  58. }
  59. };;
  60. private JLabel simSpeedLabel = new JLabel("Speed:");
  61. private JSlider speedSlider = new JSlider();
  62. private final JPanel btnAndSpeedPanel = new JPanel();
  63. private final JPanel speedPanel = new JPanel();
  64. private final JPanel timeBtnPanel = new JPanel();
  65. final JButton playBtn = new JButton();
  66. final JButton timeResetBtn = new JButton();
  67. final JButton timeForwardBtn = new JButton();
  68. final JButton timeBackwardBtn = new JButton();
  69. private Timer timer;
  70. private boolean running = false;
  71. private static final long serialVersionUID = 1L;
  72. /**
  73. * Constructor.
  74. *
  75. * @param mod
  76. * the Model
  77. * @param cont
  78. * the Controller
  79. */
  80. public TimePanel(Model mod, Control cont) {
  81. super();
  82. this.model = mod;
  83. this.controller = cont;
  84. // One Iteration
  85. timer = new Timer(0, new ActionListener() {
  86. @Override
  87. public void actionPerformed(ActionEvent ae) {
  88. timeSlider.setValue(timeSlider.getValue() + 1);
  89. controller.setCurIteration(timeSlider.getValue());
  90. timer.setDelay(model.getTimerSpeed());
  91. if (timeSlider.getValue() == model.getIterations() - 1) {
  92. running = false;
  93. playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png"))
  94. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  95. timer.stop();
  96. }
  97. }
  98. });
  99. // Time Slider. Panels and Buttons
  100. this.setLayout(new BorderLayout(0, 0));
  101. this.setBorder(null);
  102. // Slider
  103. timeSlider.setPaintTicks(true);
  104. timeSlider.setPaintLabels(true);
  105. timeSlider.setMinorTickSpacing(1);
  106. timeSlider.setMajorTickSpacing(5);
  107. timeSlider.setToolTipText(Languages.getLanguage()[93]);
  108. timeSlider.setMaximum(model.getIterations() - 1);
  109. timeSlider.setValue(0);
  110. timeSlider.addChangeListener(new ChangeListener() {
  111. @Override
  112. public void stateChanged(ChangeEvent e) {
  113. controller.setCurIteration(timeSlider.getValue());
  114. }
  115. });
  116. timeSlider.addMouseListener(new MouseAdapter() {
  117. @Override
  118. public void mousePressed(MouseEvent e) {
  119. controller.resetSimulation();
  120. if (running) {
  121. playBtn.doClick();
  122. }
  123. }
  124. });
  125. timeSlider.addMouseMotionListener(new MouseAdapter() {
  126. @Override
  127. public void mouseDragged(MouseEvent e) {
  128. controller.resetSimulation();
  129. if (running) {
  130. playBtn.doClick();
  131. }
  132. }
  133. });
  134. // Panel
  135. timeBtnPanel.setBorder(null);
  136. timeBtnPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
  137. // Buttons
  138. playBtn.setToolTipText(Languages.getLanguage()[89]);
  139. playBtn.setContentAreaFilled(false);
  140. playBtn.setBorderPainted(false);
  141. playBtn.setBorder(null);
  142. playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png")).getImage()
  143. .getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  144. playBtn.addActionListener(new ActionListener() {
  145. @Override
  146. public void actionPerformed(ActionEvent e) {
  147. running = !running;
  148. if (running) {
  149. if (!model.getIsSimRunning()) {
  150. controller.setIsSimRunning(true);
  151. }
  152. timer.start();
  153. timer.setDelay(model.getTimerSpeed());
  154. playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/pause.png"))
  155. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  156. } else {
  157. timer.stop();
  158. playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png"))
  159. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  160. }
  161. }
  162. });
  163. timeResetBtn.setToolTipText(Languages.getLanguage()[90]);
  164. timeResetBtn.setContentAreaFilled(false);
  165. timeResetBtn.setBorder(null);
  166. timeResetBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/reset.png"))
  167. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  168. timeResetBtn.addActionListener(new ActionListener() {
  169. public void actionPerformed(ActionEvent ae) {
  170. timeSlider.setValue(timeSlider.getMinimum());
  171. controller.setCurIteration(timeSlider.getValue());
  172. // controller.calculateStateForCurrentTimeStep();
  173. controller.resetSimulation();
  174. if (running) {
  175. playBtn.doClick();
  176. }
  177. }
  178. });
  179. timeForwardBtn.setToolTipText(Languages.getLanguage()[91]);
  180. timeForwardBtn.setContentAreaFilled(false);
  181. timeForwardBtn.setBorder(null);
  182. timeForwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/forward.png"))
  183. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  184. timeForwardBtn.addActionListener(new ActionListener() {
  185. public void actionPerformed(ActionEvent ae) {
  186. timeSlider.setValue(timeSlider.getValue() + 1);
  187. controller.setCurIteration(timeSlider.getValue());
  188. }
  189. });
  190. timeBackwardBtn.setToolTipText(Languages.getLanguage()[92]);
  191. timeBackwardBtn.setBorder(null);
  192. timeBackwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/backward.png"))
  193. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  194. timeBackwardBtn.addActionListener(new ActionListener() {
  195. public void actionPerformed(ActionEvent ae) {
  196. timeSlider.setValue(timeSlider.getValue() - 1);
  197. controller.setCurIteration(timeSlider.getValue());
  198. }
  199. });
  200. // timeBtnPanel.add(simSpeedText);
  201. timeBtnPanel.add(playBtn);
  202. timeBtnPanel.add(timeResetBtn);
  203. /*
  204. * the backwards button isnt used anymore
  205. */
  206. // timeBtnPanel.add(timeBackwardBtn);
  207. timeBtnPanel.add(timeForwardBtn);
  208. // Speed Panel
  209. speedPanel.add(simSpeedLabel);
  210. speedPanel.add(speedSlider);
  211. speedSlider.setPaintTicks(true);
  212. speedSlider.setPaintLabels(true);
  213. speedSlider.setMaximum(5000);
  214. speedSlider.setMinimum(500);
  215. speedSlider.setValue(1000);
  216. // speedSlider.setMajorTickSpacing(100);
  217. speedSlider.addChangeListener(new ChangeListener() {
  218. @Override
  219. public void stateChanged(ChangeEvent e) {
  220. controller.setTimerSpeed(speedSlider.getValue());
  221. speedSlider.setToolTipText("Speed: " + speedSlider.getValue());
  222. }
  223. });
  224. // Buttons and Speed Panel
  225. btnAndSpeedPanel.setLayout(new BorderLayout(0, 0));
  226. btnAndSpeedPanel.setBorder(null);
  227. btnAndSpeedPanel.add(timeBtnPanel, BorderLayout.NORTH);
  228. btnAndSpeedPanel.add(speedPanel, BorderLayout.CENTER);
  229. this.add(btnAndSpeedPanel, BorderLayout.WEST);
  230. this.add(timeSlider);
  231. //Left arrow Key
  232. timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "LEFT_ARROW");
  233. timeSlider.getActionMap().put("LEFT_ARROW", new AbstractAction() {
  234. private static final long serialVersionUID = 1L;
  235. @Override
  236. public void actionPerformed(ActionEvent e) {
  237. timeSlider.setValue(timeSlider.getValue()-1);
  238. controller.resetSimulation();
  239. }
  240. });
  241. }
  242. /**
  243. * Retunrs the TimeSlider.
  244. *
  245. * @return the TimeSlider
  246. */
  247. public JSlider getTimeSlider() {
  248. return timeSlider;
  249. }
  250. }