TimePanel.java 7.7 KB

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