TimePanel.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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.setBackground(Color.WHITE);
  109. timeSlider.addChangeListener(new ChangeListener() {
  110. @Override
  111. public void stateChanged(ChangeEvent e) {
  112. controller.setCurIteration(timeSlider.getValue());
  113. }
  114. });
  115. timeSlider.addMouseListener(new MouseAdapter() {
  116. @Override
  117. public void mousePressed(MouseEvent e) {
  118. controller.resetSimulation();
  119. }
  120. });
  121. timeSlider.addMouseMotionListener(new MouseAdapter() {
  122. @Override
  123. public void mouseDragged(MouseEvent e) {
  124. controller.resetSimulation();
  125. }
  126. });
  127. // Panel
  128. timeBtnPanel.setBorder(null);
  129. timeBtnPanel.setBackground(Color.WHITE);
  130. timeBtnPanel.setLayout(new FlowLayout());
  131. // Buttons
  132. playBtn.setToolTipText(Languages.getLanguage()[89]);
  133. playBtn.setBackground(Color.WHITE);
  134. playBtn.setBorderPainted(false);
  135. playBtn.setBorder(new LineBorder(Color.WHITE, 4));
  136. playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png")).getImage()
  137. .getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  138. playBtn.addActionListener(new ActionListener() {
  139. @Override
  140. public void actionPerformed(ActionEvent e) {
  141. running = !running;
  142. if (running) {
  143. timer.start();
  144. timer.setDelay(model.getTimerSpeed());
  145. playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/pause.png"))
  146. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  147. } else {
  148. timer.stop();
  149. playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png"))
  150. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  151. }
  152. }
  153. });
  154. timeResetBtn.setToolTipText(Languages.getLanguage()[90]);
  155. timeResetBtn.setBorderPainted(false);
  156. timeResetBtn.setBackground(Color.WHITE);
  157. timeResetBtn.setBorder(new LineBorder(Color.WHITE, 4));
  158. timeResetBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/reset.png"))
  159. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  160. timeResetBtn.addActionListener(new ActionListener() {
  161. public void actionPerformed(ActionEvent ae) {
  162. timeSlider.setValue(timeSlider.getMinimum());
  163. controller.setCurIteration(timeSlider.getValue());
  164. // controller.calculateStateForCurrentTimeStep();
  165. controller.resetSimulation();
  166. }
  167. });
  168. timeForwardBtn.setToolTipText(Languages.getLanguage()[91]);
  169. timeForwardBtn.setBorderPainted(false);
  170. timeForwardBtn.setContentAreaFilled(false);
  171. timeForwardBtn.setBorder(new LineBorder(Color.WHITE, 4));
  172. timeForwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/forward.png"))
  173. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  174. timeForwardBtn.addActionListener(new ActionListener() {
  175. public void actionPerformed(ActionEvent ae) {
  176. timeSlider.setValue(timeSlider.getValue() + 1);
  177. controller.setCurIteration(timeSlider.getValue());
  178. }
  179. });
  180. timeBackwardBtn.setToolTipText(Languages.getLanguage()[92]);
  181. timeBackwardBtn.setBackground(Color.WHITE);
  182. timeBackwardBtn.setBorderPainted(false);
  183. timeBackwardBtn.setBorder(new LineBorder(Color.WHITE, 4));
  184. timeBackwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/backward.png"))
  185. .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
  186. timeBackwardBtn.addActionListener(new ActionListener() {
  187. public void actionPerformed(ActionEvent ae) {
  188. timeSlider.setValue(timeSlider.getValue() - 1);
  189. controller.setCurIteration(timeSlider.getValue());
  190. }
  191. });
  192. // timerSpeed
  193. simSpeedText.addCaretListener(new CaretListener() {
  194. @Override
  195. public void caretUpdate(CaretEvent e) {
  196. try {
  197. controller.setTimerSpeed(Integer.parseInt(simSpeedText.getText()));
  198. } catch (Exception ex) {
  199. // TODO: handle exception
  200. }
  201. }
  202. });
  203. timeBtnPanel.add(simSpeedLabel);
  204. timeBtnPanel.add(simSpeedText);
  205. timeBtnPanel.add(playBtn);
  206. timeBtnPanel.add(timeResetBtn);
  207. /*
  208. * the backwards button isnt used anymore
  209. */
  210. // timeBtnPanel.add(timeBackwardBtn);
  211. timeBtnPanel.add(timeForwardBtn);
  212. this.add(timeBtnPanel, BorderLayout.WEST);
  213. this.add(timeSlider);
  214. }
  215. /**
  216. * Retunrs the TimeSlider.
  217. *
  218. * @return the TimeSlider
  219. */
  220. public JSlider getTimeSlider() {
  221. return timeSlider;
  222. }
  223. }