Browse Source

Merge branch 'Ohne_Drag_and_Drop' of https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons into Ohne_Drag_and_Drop

Teh-Hai Julian Zheng 8 years ago
parent
commit
ab7a6e0f41

BIN
res/Button_Images/backward.png


BIN
res/Button_Images/forward.png


BIN
res/Button_Images/pause.png


BIN
res/Button_Images/play.png


BIN
res/Button_Images/reset.png


BIN
res/Images/Thumbs.db


+ 3 - 0
src/ui/controller/Control.java

@@ -104,6 +104,9 @@ public class Control {
 	public void deleteElementCanvas(int id, String element) {
 		objectController.deleteElementInCanvas(id, element);
 	}
+	public void deleteElementCanvas(HolonObject obj, HolonElement ele) {
+		objectController.deleteElement(obj, ele);
+	}
 
 	public CpsObject searchByID(int ID){
 		return objectController.searchByID(ID);

+ 21 - 18
src/ui/controller/ObjectController.java

@@ -12,7 +12,6 @@ import Interfaces.ObjectListener;
 
 public class ObjectController {
 
-
 	private Model MODEL;
 
 	public ObjectController(Model model) {
@@ -108,6 +107,7 @@ public class ObjectController {
 
 	/**
 	 * deletes a Element from a given Canvas Object
+	 * 
 	 * @param ID
 	 * @param ele
 	 * @param amount
@@ -116,15 +116,16 @@ public class ObjectController {
 		HolonObject object = (HolonObject) searchByID(ID);
 		HolonElement element = searchHolonElement(object, ele);
 
-//		element.setAmount(element.getAmount() - amount);
-//
-//		if (element.getAmount() <= 0)
-			deleteElement(object, element);
+		// element.setAmount(element.getAmount() - amount);
+		//
+		// if (element.getAmount() <= 0)
+		deleteElement(object, element);
 
 	}
-	
+
 	/**
 	 * deletes a Element from a given Category Object
+	 * 
 	 * @param cat
 	 * @param obj
 	 * @param ele
@@ -134,7 +135,7 @@ public class ObjectController {
 		Category category = searchCategory(cat, MODEL.getCategories());
 		HolonObject object = searchHolonObject(obj, category.getObjects());
 		HolonElement element = searchHolonElement(object, ele);
-		
+
 		deleteElement(object, element);
 	}
 
@@ -145,7 +146,7 @@ public class ObjectController {
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Search for Object
 	 * 
@@ -160,16 +161,17 @@ public class ObjectController {
 		}
 		return null;
 	}
-	
+
 	/**
 	 * Search for Object by ID
+	 * 
 	 * @param ID
 	 * @param list
 	 * @return
 	 */
-	public CpsObject searchByID(int ID){
+	public CpsObject searchByID(int ID) {
 		for (CpsObject objects : MODEL.getObjectsOnCanvas()) {
-			if(objects.getID() == ID)
+			if (objects.getID() == ID)
 				return objects;
 		}
 		return null;
@@ -177,20 +179,21 @@ public class ObjectController {
 
 	/**
 	 * Search for Element
+	 * 
 	 * @param object
 	 * @param element
 	 * @return
 	 */
 	public HolonElement searchHolonElement(HolonObject object, String element) {
-
-		for (HolonElement elements : object.getElements()) {
-			if (elements.getEleName().equals(element))
-				return elements;
+		HolonElement temp = null;
+		if (object.getElements() != null) {
+			for (HolonElement elements : object.getElements()) {
+				if (elements.getEleName().equals(element))
+					temp = elements;
+			}
 		}
-		return null;
+		return temp;
 	}
-	
-
 
 	/**
 	 * Returns the ID of the selected Object 0 = no Object is selected

+ 3 - 3
src/ui/model/idCounter.java

@@ -1,10 +1,10 @@
 package ui.model;
 
 public class idCounter {
-	private static int counter = 0;
+	private static int counter = 1;
 
 	public static synchronized int nextId() {
-		return ++counter;
-		
+		return counter++;
+
 	}
 }

+ 56 - 59
src/ui/view/GUI.java

@@ -1,10 +1,7 @@
 package ui.view;
 
 import java.io.File;
-import java.text.AttributedCharacterIterator;
 import java.util.ArrayList;
-import java.util.concurrent.TimeUnit;
-
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JMenuBar;
@@ -12,7 +9,6 @@ import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
 import javax.swing.JTree;
-import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
 import javax.swing.JSplitPane;
 import javax.swing.JScrollPane;
@@ -21,8 +17,6 @@ import javax.swing.JTable;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.TreeCellRenderer;
 
-import com.sun.xml.internal.bind.v2.TODO;
-
 import ui.controller.Control;
 import ui.model.*;
 
@@ -30,20 +24,12 @@ import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.JEditorPane;
 import javax.swing.JFileChooser;
 import javax.swing.table.DefaultTableModel;
-import javax.swing.table.TableModel;
-
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Cursor;
 import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
 import java.awt.Image;
 import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.ScrollPane;
-import java.awt.Shape;
 import java.awt.Toolkit;
 import java.awt.BorderLayout;
 
@@ -61,21 +47,18 @@ import classes.HolonElement;
 import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.HolonTransformer;
-import javafx.util.Pair;
 import Interfaces.CategoryListener;
 
 import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.awt.image.ImageObserver;
-import java.awt.peer.MouseInfoPeer;
+import java.awt.event.MouseListener;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.awt.event.ActionEvent;
 import javax.swing.JSlider;
 import javax.swing.event.ChangeListener;
 import javax.swing.event.ChangeEvent;
-import javax.swing.SwingConstants;
 
 public class GUI implements CategoryListener {
 
@@ -113,7 +96,8 @@ public class GUI implements CategoryListener {
 
 	private JTable tableHolonElement = new JTable();
 	private DefaultTableModel tableModelHolonElement = new DefaultTableModel();
-	private final JScrollPane scrollElements = new JScrollPane();
+	private final JPanel scrollElements = new JPanel();
+	JScrollPane tableHolonElementScrollPane = new JScrollPane();
 
 	// In this section are all the properties that correspond to the clicked
 	// HolonObject, such as connections, name, Type, etc.
@@ -156,15 +140,15 @@ public class GUI implements CategoryListener {
 	private Image img = null;
 	private CpsObject tempCps = null;
 	private HolonElement tempElement = null;
+	private int yValueElements = 0;
 
 	private MyCanvas canvas;
 	private UnitGraph testgraph; // for testing, remove later
 	private final JSplitPane splitPane_3 = new JSplitPane();
 	private final JSlider sizeSlider = new JSlider();
 	private final JLabel lblImageSize = new JLabel("Image Size");
-	private final JSlider timeSlider = new JSlider();
-	private final JPanel timePanel = new JPanel();
-	private final JButton playBtn = new JButton();
+	// Time Stuff
+	private final TimePanel timePanel;
 
 	/**
 	 * Create the application.
@@ -174,7 +158,10 @@ public class GUI implements CategoryListener {
 		this.model = control.getModel();
 		this.canvas = new MyCanvas(model, control);
 		this.testgraph = new UnitGraph(model, control); // for testing, remove
-														// later
+
+		timePanel = new TimePanel(model, controller);
+
+		// later
 		control.initListener(this);
 		initialize();
 		updateCategories(model.getCategories());
@@ -191,8 +178,9 @@ public class GUI implements CategoryListener {
 		frmCyberPhysical.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
 		frmCyberPhysical.setJMenuBar(menuBar);
-		
-		frmCyberPhysical.setIconImage(new ImageIcon(this.getClass().getResource("/Images/Dummy_House.png")).getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH));
+
+		frmCyberPhysical.setIconImage(new ImageIcon(this.getClass().getResource("/Images/Dummy_House.png")).getImage()
+				.getScaledInstance(30, 30, Image.SCALE_SMOOTH));
 
 		menuBar.add(mnNewMenu);
 
@@ -279,10 +267,13 @@ public class GUI implements CategoryListener {
 		 * End of right container setup
 		 */
 		scrollProperties.setViewportView(tableProperties);
-		scrollElements.setViewportView(tableHolonElement);
+		tableHolonElementScrollPane.setViewportView(tableHolonElement);
 		scrollGraph.setViewportView(testgraph);
-
-		scrollElements.setRowHeaderView(panel_HolonEl);
+		
+		scrollElements.setLayout(new BorderLayout(0,0));
+		scrollElements.add(panel_HolonEl, BorderLayout.NORTH);
+		scrollElements.add(tableHolonElementScrollPane);		
+		
 		panel_HolonEl.setLayout(new BoxLayout(panel_HolonEl, BoxLayout.X_AXIS));
 		toolBarHolonEl.setFloatable(false);
 
@@ -290,30 +281,33 @@ public class GUI implements CategoryListener {
 		toolBarHolonEl.add(btnAddHolEL);
 		btnAddHolEL.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent arg0) {
-				if (tempCps != null && tempCps.getClass() == HolonObject.class) {
+				CpsObject tempCpsObject = getActualCps();
+				if (tempCpsObject != null && tempCpsObject.getClass() == HolonObject.class
+						&& tempCpsObject.getID() != 0) {
 					addElementPopUp = new AddElementPopUp();
 					addElementPopUp.setVisible(true);
-					((HolonObject) tempCps).addElements(addElementPopUp.getElement());
+					controller.addElementCanvasObject(tempCpsObject.getName(),
+							addElementPopUp.getElement().getEleName(), addElementPopUp.getElement().getAmount(),
+							addElementPopUp.getElement().getEnergy());
 				}
 			}
 		});
 		toolBarHolonEl.add(btnDelHolEL);
 		btnDelHolEL.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent arg0) {
-				if (tempElement != null) {
-					((HolonObject) tempCps).getElements().remove(tempElement);
+				if (getActualCps().getClass() == HolonObject.class) {
+					HolonObject obj = (HolonObject) getActualCps();
+					tempElement = getActualHolonElement(obj, yValueElements);
+					if (tempElement != null && obj.getClass() == HolonObject.class && obj.getID() != 0) {
+						controller.deleteElementCanvas(obj.getID(), tempElement.getEleName());
+					}
 				}
 			}
 		});
 
 		tableHolonElement.addMouseListener(new MouseAdapter() {
 			public void mousePressed(MouseEvent e) {
-				int rowSelected = (int) Math.floor(e.getY() / 16);
-				if (tableHolonElement.getSelectedColumn() == 0 && tableHolonElement.getRowCount() >= rowSelected) {
-					tempElement = ((HolonObject) tempCps).getElements().get(rowSelected);
-				} else {
-					tempElement = null;
-				}
+				yValueElements = e.getY();
 			}
 		});
 		frmCyberPhysical.getContentPane().setLayout(new BorderLayout(0, 0));
@@ -483,7 +477,6 @@ public class GUI implements CategoryListener {
 		canvas.addMouseListener(new MouseAdapter() {
 			@Override
 			public void mousePressed(MouseEvent e) {
-
 				// Update of the Information about the HolonElements - only for
 				// HolonObjects
 				if (tableModelHolonElement.getRowCount() > 0) {
@@ -548,6 +541,7 @@ public class GUI implements CategoryListener {
 					}
 				}
 			}
+
 		});
 
 		tableHolonElement.addPropertyChangeListener(new PropertyChangeListener() {
@@ -657,6 +651,7 @@ public class GUI implements CategoryListener {
 		splitPane.setRightComponent(splitPane_1);
 		splitPane.setDividerLocation(200);
 		splitPane_1.setDividerLocation(500);
+
 		splitPane.setLeftComponent(scrollPane_1);
 		splitPane_1.setLeftComponent(tabbedPane);
 		splitPane_1.setRightComponent(split_HolonEl_Pro);
@@ -667,27 +662,15 @@ public class GUI implements CategoryListener {
 		split_Graph_HolonEl.setTopComponent(scrollGraph);
 		split_Graph_HolonEl.setBottomComponent(scrollElements);
 
-		timePanel.setLayout(new BorderLayout(0, 0));
-		timeSlider.setPaintTicks(true);
-		timeSlider.setPaintLabels(true);
-		timeSlider.setMinorTickSpacing(1);
-		timeSlider.setToolTipText("");
-
-		timeSlider.setMinimum(1);
-		timeSlider.setMaximum(model.getIterations());
-		timeSlider.setValue(1);
-
-		playBtn.setBorder(BorderFactory.createEmptyBorder());
-		playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Images/node.png")).getImage()
-				.getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
-		playBtn.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent ae) {
-				timeSlider.setValue(timeSlider.getValue() + 1);
-			}
-		});
+		tabbedPane.setBorder(null);
+		scrollProperties.setBorder(null);
+		scrollGraph.setBorder(null);
+		scrollElements.setBorder(null);
+		splitPane.setBorder(null);
+		splitPane_1.setBorder(null);
+		split_HolonEl_Pro.setBorder(null);
+		split_Graph_HolonEl.setBorder(null);
 
-		timePanel.add(playBtn, BorderLayout.WEST);
-		timePanel.add(timeSlider);
 		frmCyberPhysical.getContentPane().add(timePanel, BorderLayout.SOUTH);
 	}
 
@@ -763,4 +746,18 @@ public class GUI implements CategoryListener {
 		return frmCyberPhysical;
 	}
 
+	public CpsObject getActualCps() {
+		return canvas.tempCps;
+	}
+
+	public HolonElement getActualHolonElement(HolonObject obj, int yValue) {
+		HolonObject tempCps = obj;
+		final int yTemp = (int) Math.floor(yValue / 16);
+		int rowsTotal = tableModelHolonElement.getRowCount();
+		if (rowsTotal != 0 && rowsTotal > yTemp) {
+			return obj.getElements().get(yTemp);
+		} else {
+			return null;
+		}
+	}
 }

+ 0 - 3
src/ui/view/Main.java

@@ -29,9 +29,6 @@ public class Main {
 					Model MODEL = new Model();
 					Control CONTROL = new Control(MODEL);
 					GUI VIEW = new GUI(CONTROL);
-					
-					
-					
 
 					VIEW.getFrmCyberPhysical().setVisible(true);
 					

+ 21 - 18
src/ui/view/MyCanvas.java

@@ -23,7 +23,6 @@ import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.JToolTip;
 
-
 import classes.CpsEdge;
 import classes.CpsNode;
 import classes.CpsObject;
@@ -107,31 +106,30 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 
 		for (CpsEdge con : model.getEdgesOnCanvas()) {
 			if (con.getA().getID() != model.getSelectedObjectID() && con.getB().getID() != model.getSelectedObjectID()
-					&& con != edgeHighlight)
+					&& con != edgeHighlight) {
 				g2.drawLine(con.getA().getPosition().x + controller.getScaleDiv2(),
 						con.getA().getPosition().y + controller.getScaleDiv2(),
 						con.getB().getPosition().x + controller.getScaleDiv2(),
 						con.getB().getPosition().y + controller.getScaleDiv2());
-			g2.drawString(con.getFlow() + "/" + con.getCapacity(),
-					(con.getA().getPosition().x + con.getB().getPosition().x) / 2 + controller.getScaleDiv2(),
-					(con.getA().getPosition().y + con.getB().getPosition().y) / 2 + controller.getScaleDiv2());
+				g2.drawString(con.getFlow() + "/" + con.getCapacity(),
+						(con.getA().getPosition().x + con.getB().getPosition().x) / 2 + controller.getScaleDiv2(),
+						(con.getA().getPosition().y + con.getB().getPosition().y) / 2 + controller.getScaleDiv2());
+			}
 		}
 
 		// Highlighted Edge
 		if (model.getSelectedObjectID() > 0) {
 			g2.setColor(Color.GREEN);
-			for (CpsObject cps : model.getObjectsOnCanvas()) {
-				for (CpsEdge con : cps.getConnectedTo()) {
-					if (con.getA().getID() == model.getSelectedObjectID()) {
-						g2.drawLine(cps.getPosition().x + controller.getScaleDiv2(),
-								cps.getPosition().y + controller.getScaleDiv2(),
-								con.getA().getPosition().x + controller.getScaleDiv2(),
-								con.getA().getPosition().y + controller.getScaleDiv2());
-					} else if (con.getB().getID() == model.getSelectedObjectID())
-						g2.drawLine(cps.getPosition().x + controller.getScaleDiv2(),
-								cps.getPosition().y + controller.getScaleDiv2(),
-								con.getB().getPosition().x + controller.getScaleDiv2(),
-								con.getB().getPosition().y + controller.getScaleDiv2());
+			for (CpsEdge con : model.getEdgesOnCanvas()) {
+				if (con.getA().getID() == model.getSelectedObjectID() || con.getB().getID() == model.getSelectedObjectID()
+						&& con != edgeHighlight) {
+					g2.drawLine(con.getA().getPosition().x + controller.getScaleDiv2(),
+							con.getA().getPosition().y + controller.getScaleDiv2(),
+							con.getB().getPosition().x + controller.getScaleDiv2(),
+							con.getB().getPosition().y + controller.getScaleDiv2());
+					g2.drawString(con.getFlow() + "/" + con.getCapacity(),
+							(con.getA().getPosition().x + con.getB().getPosition().x) / 2 + controller.getScaleDiv2(),
+							(con.getA().getPosition().y + con.getB().getPosition().y) / 2 + controller.getScaleDiv2());
 				}
 			}
 		} else if (edgeHighlight != null) {
@@ -140,6 +138,11 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 					edgeHighlight.getA().getPosition().y + controller.getScaleDiv2(),
 					edgeHighlight.getB().getPosition().x + controller.getScaleDiv2(),
 					edgeHighlight.getB().getPosition().y + controller.getScaleDiv2());
+			g2.drawString(edgeHighlight.getFlow() + "/" + edgeHighlight.getCapacity(),
+					(edgeHighlight.getA().getPosition().x + edgeHighlight.getB().getPosition().x) / 2
+							+ controller.getScaleDiv2(),
+					(edgeHighlight.getA().getPosition().y + edgeHighlight.getB().getPosition().y) / 2
+							+ controller.getScaleDiv2());
 		}
 
 		// Objects
@@ -428,7 +431,7 @@ class MyCanvas extends JPanel implements MouseListener, MouseMotionListener {
 				ly = p.getA().getPosition().y + model.getScaleDiv2() - 7;
 				hy = p.getB().getPosition().y + model.getScaleDiv2() + 7;
 			}
-			
+
 			// distance from a point to a line and between both Objects
 			if (l.ptLineDistSq(x - model.getScaleDiv2(), y - model.getScaleDiv2()) < 14 && x > lx && x < hx && y > ly
 					&& y < hy) {

+ 137 - 0
src/ui/view/TimePanel.java

@@ -0,0 +1,137 @@
+package ui.view;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.Timer;
+import javax.swing.border.LineBorder;
+
+import ui.controller.Control;
+import ui.model.Model;
+
+public class TimePanel extends JPanel {
+
+	private Model model;
+	private Control controller;
+
+	JSlider timeSlider = new JSlider();
+	private final JPanel timeBtnPanel = new JPanel();
+	private final JButton playBtn = new JButton();
+	private final JButton timeResetBtn = new JButton();
+	private final JButton timeForwardBtn = new JButton();
+	private final JButton timeBackwardBtn = new JButton();
+	private Timer timer;
+	private boolean running = false;
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public TimePanel(Model mod, Control cont) {
+		super();
+		this.model = mod;
+		this.controller = cont;
+
+		// One Iteration
+		timer = new Timer(1000, new ActionListener() {
+			@Override
+			public void actionPerformed(ActionEvent ae) {
+				timeSlider.setValue(timeSlider.getValue() + 1);
+				if (timeSlider.getValue() == model.getIterations()) {
+					running = false;
+					playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png"))
+							.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
+					timer.stop();
+				}
+			}
+		});
+
+		// Time Slider. Panels and Buttons
+		this.setLayout(new BorderLayout(0, 0));
+		this.setBorder(null);
+		// Slider
+		timeSlider.setPaintTicks(true);
+		timeSlider.setPaintLabels(true);
+		timeSlider.setMinorTickSpacing(1);
+		timeSlider.setToolTipText("Time Slider");
+		timeSlider.setMinimum(1);
+		timeSlider.setMaximum(model.getIterations());
+		timeSlider.setValue(1);
+		timeSlider.setBackground(Color.WHITE);
+		timeBtnPanel.setBackground(Color.WHITE);
+
+		// Buttons
+		timeBtnPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
+
+		playBtn.setBackground(Color.WHITE);
+		playBtn.setBorderPainted(false);
+		playBtn.setBorder(new LineBorder(Color.WHITE, 4));
+		playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png")).getImage()
+				.getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
+		playBtn.addActionListener(new ActionListener() {
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				running = !running;
+				if (running) {
+					timer.start();
+					playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/pause.png"))
+							.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
+				} else {
+					timer.stop();
+					playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png"))
+							.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
+				}
+			}
+		});
+
+		timeResetBtn.setBorderPainted(false);
+		timeResetBtn.setBackground(Color.WHITE);
+		timeResetBtn.setBorder(new LineBorder(Color.WHITE, 4));
+		timeResetBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/reset.png"))
+				.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
+		timeResetBtn.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ae) {
+				timeSlider.setValue(timeSlider.getMinimum());
+			}
+		});
+
+		timeForwardBtn.setBorderPainted(false);
+		timeForwardBtn.setContentAreaFilled(false);
+		timeForwardBtn.setBorder(new LineBorder(Color.WHITE, 4));
+		timeForwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/forward.png"))
+				.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
+		timeForwardBtn.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ae) {
+				timeSlider.setValue(timeSlider.getValue() + 1);
+			}
+		});
+
+		timeBackwardBtn.setBackground(Color.WHITE);
+		timeBackwardBtn.setBorderPainted(false);
+		timeBackwardBtn.setBorder(new LineBorder(Color.WHITE, 4));
+		timeBackwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/backward.png"))
+				.getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)));
+		timeBackwardBtn.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent ae) {
+				timeSlider.setValue(timeSlider.getValue() - 1);
+			}
+		});
+
+		timeBtnPanel.add(playBtn);
+		timeBtnPanel.add(timeResetBtn);
+		timeBtnPanel.add(timeBackwardBtn);
+		timeBtnPanel.add(timeForwardBtn);
+
+		this.add(timeBtnPanel, BorderLayout.WEST);
+		this.add(timeSlider);
+	}
+}