TimePanel.java 9.3 KB

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