Browse Source

Adds Zero Line to Unit Graph

- Refactor Interfaces
- Basic FilterFunctions in InformationPanel
TomTroppmann 2 years ago
parent
commit
5e07eba20c

+ 0 - 10
src/interfaces/FocusListener.java

@@ -1,10 +0,0 @@
-package interfaces;
-
-
-public interface FocusListener extends java.awt.event.FocusListener{
-	@Override
-	public default void focusGained (java.awt.event.FocusEvent evt) {
-    	//Do nothing
-    }
-	//focusLost has to be defined in the lambda expression 
-}

+ 0 - 13
src/interfaces/GraphListener.java

@@ -1,13 +0,0 @@
-package interfaces;
-
-import classes.AbstractCanvasObject;
-
-import java.util.ArrayList;
-
-//TODO delete
-public interface GraphListener {
-
-    void repaintTree();
-
-    void addTrackedObject(ArrayList<AbstractCanvasObject> hlList);
-}

+ 1 - 10
src/ui/model/Model.java

@@ -25,7 +25,6 @@ import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.Node;
 import classes.Pair;
-import interfaces.GraphListener;
 import interfaces.ObjectListener;
 import utility.Vector2Int;
 
@@ -58,8 +57,7 @@ public class Model {
     private HashMap<Integer, ArrayList<HolonElement>> eleToDelete;
     // Capacity for Edge
     private float maxCapacity;
-    
-    private ArrayList<GraphListener> graphListeners = new ArrayList<GraphListener>();
+   
     // Iteration Speed
     private int timerSpeed = 1000;
     private int selectedID = 0;
@@ -323,12 +321,6 @@ public class Model {
         return iterations;
     }
 
-    private void notifyGraphListeners() {
-        for (GraphListener gl : graphListeners) {
-            gl.repaintTree();
-        }
-
-    }
 
     /**
      * Returns cURiTERATION.
@@ -346,7 +338,6 @@ public class Model {
      */
     public void setCurIteration(int curIT) {
         this.curIteration = curIT;
-        notifyGraphListeners();
     }
 
     /**

+ 4 - 5
src/ui/view/information/FilterableGroupNode.java

@@ -1,25 +1,24 @@
 package ui.view.information;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import classes.Node;
-import jdk.jfr.Unsigned;
+import classes.Flexibility;
 import classes.GroupNode;
 import classes.HolonElement;
-import classes.Flexibility;
+import classes.Node;
+import jdk.jfr.Unsigned;
 import ui.model.Consumer;
 import ui.model.DecoratedCable;
 import ui.model.DecoratedGroupNode;
 import ui.model.DecoratedHolonObject;
+import ui.model.DecoratedHolonObject.HolonObjectState;
 import ui.model.DecoratedSwitch;
 import ui.model.ExitCable;
 import ui.model.Passiv;
 import ui.model.Supplier;
-import ui.model.DecoratedHolonObject.HolonObjectState;
 
 /**
  * For the @VisualRepresentationalState only.

+ 0 - 2
src/ui/view/information/HolonInformationPanel.java

@@ -14,7 +14,6 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.swing.BorderFactory;
-import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JLayeredPane;
 import javax.swing.JPanel;
@@ -40,7 +39,6 @@ import ui.model.Consumer;
 import ui.model.DecoratedGroupNode;
 import ui.model.DecoratedHolonObject;
 import ui.model.DecoratedHolonObject.HolonObjectState;
-import ui.model.Model;
 import ui.model.Passiv;
 import ui.model.Supplier;
 import utility.FormatFloat;

+ 35 - 18
src/ui/view/inspector/Inspector.java

@@ -26,6 +26,8 @@ import interfaces.TimelineDependent;
 import ui.controller.Control;
 import utility.FormatFloat;
 import utility.ImageImport;
+import utility.Maths;
+import utility.listener.ResizeListener;
 
 public class Inspector extends JSplitPane {
 	private final UnitGraph unitGraph;
@@ -39,6 +41,7 @@ public class Inspector extends JSplitPane {
 	private final JPanel globalCurveLabel = new JPanel();
 	private final JLabel minEnergy = new JLabel("0.0");
 	private final JLabel maxEnergy = new JLabel("0.0");
+	private final JLabel zeroEnergy = new JLabel("0.0");
 	private final JToolBar toolBarGraph = new JToolBar();
 	private String[] comboContext = { "", "5", "10", "20", "100", "1000" };
 	private JComboBox<String> localPeriodInput = new JComboBox<String>(comboContext);
@@ -74,14 +77,17 @@ public class Inspector extends JSplitPane {
 		graphLabel.add(medGraph, BorderLayout.CENTER);
 		graphLabel.add(minGraph, BorderLayout.SOUTH);
 
-		
-		globalCurveLabel.setLayout(new BorderLayout(0, 10));
+		globalCurveLabel.setLayout(null);
+		globalCurveLabel.setMinimumSize(new Dimension(20, 0));
+		globalCurveLabel.setPreferredSize(new Dimension(20, 0));
 		maxEnergy.setForeground(Color.red);
 		minEnergy.setForeground(Color.red);
-		globalCurveLabel.add(maxEnergy, BorderLayout.NORTH);
-		globalCurveLabel.add(minEnergy, BorderLayout.SOUTH);
-		
-		
+		zeroEnergy.setForeground(Color.red);
+		globalCurveLabel.add(maxEnergy);
+		globalCurveLabel.add(zeroEnergy);
+		globalCurveLabel.add(minEnergy);
+		this.globalCurveLabel.addComponentListener((ResizeListener)resize -> updateGlobalCurve() );
+
 		toolBarGraph.setFloatable(false);
 		toolBarGraph.setAlignmentY(Component.RIGHT_ALIGNMENT);
 
@@ -152,14 +158,12 @@ public class Inspector extends JSplitPane {
 		for (TimelineDependent element : elements) {
 			unitGraph.addNewSeries(element);
 		}
-			
-		
-		if(elements.isEmpty()) {
+
+		if (elements.isEmpty()) {
 			control.getModel().getSelectedObjects().stream().filter(obj -> obj instanceof HolonSwitch)
-			.forEach(obj -> unitGraph.addNewSeries((HolonSwitch) obj));			
+					.forEach(obj -> unitGraph.addNewSeries((HolonSwitch) obj));
 		}
-		
-		
+
 //		if (elements.isEmpty()) {
 //			this.setDividerLocation(1.0);
 //		}
@@ -169,19 +173,32 @@ public class Inspector extends JSplitPane {
 				.setItem(unitGraph.isLocalPeriedDifferentInSeries() ? "-" : unitGraph.getFirstLocalPeriod());
 	}
 
-	
-	
 	private void updateGlobalCurve() {
-		Set<HolonElement> elements = InspectorTable.extractElements(control.getModel().getSelectedObjects()).collect(Collectors.toSet());
+		Set<HolonElement> elements = InspectorTable.extractElements(control.getModel().getSelectedObjects())
+				.collect(Collectors.toSet());
 		unitGraph.setGlobalCurve(elements);
 		double maxEnergy = elements.stream().map(ele -> ele.getEnergy()).filter(energy -> energy > 0).reduce(0.0f,
 				Float::sum);
 		double minEnergy = elements.stream().map(ele -> ele.getEnergy()).filter(energy -> energy < 0).reduce(0.0f,
 				Float::sum);
-		this.minEnergy.setText(FormatFloat.doubleTwoPlaces(minEnergy));		
-		this.maxEnergy.setText(FormatFloat.doubleTwoPlaces(maxEnergy));	
+		double percentage = Maths.inverseLinearInterpolation(maxEnergy, minEnergy, 0.0);
+		int widgetHeight = this.globalCurveLabel.getHeight();
+		int textMiddle = this.zeroEnergy.getPreferredSize().height / 4;
+		int zeroYPos = (int)(widgetHeight * percentage) - textMiddle;
+		this.minEnergy.setText(FormatFloat.doubleTwoPlaces(minEnergy));
+		this.maxEnergy.setText(FormatFloat.doubleTwoPlaces(maxEnergy));
+		this.maxEnergy.setBounds(0, 0, this.maxEnergy.getPreferredSize().width,
+				this.maxEnergy.getPreferredSize().height);
+		this.minEnergy.setBounds(0, widgetHeight - this.minEnergy.getPreferredSize().height, this.minEnergy.getPreferredSize().width,
+				this.minEnergy.getPreferredSize().height);
+		this.zeroEnergy.setBounds(0, zeroYPos, this.zeroEnergy.getPreferredSize().width,
+				this.zeroEnergy.getPreferredSize().height);
+		this.globalCurveLabel.setPreferredSize(new Dimension(
+				Math.max(this.zeroEnergy.getPreferredSize().width,
+						Math.max(this.maxEnergy.getPreferredSize().width, this.minEnergy.getPreferredSize().width)),
+				0));
 	}
-	
+
 	/**
 	 * Displayed the actual LocalModeState.
 	 * 

+ 1 - 1
src/ui/view/inspector/InspectorTable.java

@@ -48,7 +48,7 @@ import ui.view.component.TrippleCheckBox.State;
 import utility.ImageImport;
 import utility.Pool;
 import utility.events.Action;
-import utility.events.SimpleDocumentListener;
+import utility.listener.SimpleDocumentListener;
 
 public class InspectorTable extends JPanel {
 	private Pool<ElementRow> rowPool = new Pool<ElementRow>() {

+ 15 - 1
src/ui/view/inspector/UnitGraph.java

@@ -54,6 +54,7 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 	private static final Color[] seriesColorArray = { Color.blue, Color.cyan, Color.black, Color.green, Color.gray,
 			Color.magenta, Color.yellow, Color.PINK, Color.red };
 	private static final Color globalCurveColor = new Color(255, 30, 30);
+	private static final Color zeroLineColor = new Color(255, 153, 153);
 
 	// Intern Variables
 	private class Series {
@@ -71,6 +72,7 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 		public LinkedList<UnitGraphPoint> points = new LinkedList<UnitGraphPoint>();
 		public float minEnergy;
 		public float maxEnergy;
+		public LinkedList<UnitGraphPoint> zeroLinePoints = new LinkedList<UnitGraphPoint>();
 	}
 
 	private Optional<GlobalCurve> globalCurve = Optional.empty();
@@ -126,7 +128,6 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 	}
 
 	public void setGlobalCurve(Set<HolonElement> elements) {
-		// TODO debug timing -> if to long async
 		if(elements.isEmpty()) {
 			this.globalCurve = Optional.empty();
 			return;
@@ -154,9 +155,16 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 		for (UnitGraphPoint p : curve.points) {
 			p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
 		}
+		double zeroLineYPos = Maths.inverseLinearInterpolation(curve.minEnergy, curve.maxEnergy, 0.0);
+		curve.zeroLinePoints.add(new UnitGraphPoint(0.0,zeroLineYPos, false));
+		curve.zeroLinePoints.add(new UnitGraphPoint(1.0,zeroLineYPos, false));
+		for (UnitGraphPoint p : curve.zeroLinePoints) {
+			p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
+		}
 		// set global curve
 		this.globalCurve = Optional.of(curve);
 		this.elements = elements;
+		
 	}
 
 	private void updateGlobalCurve() {
@@ -191,6 +199,9 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 		this.globalCurve.ifPresent(curve -> {
 			g2D.setColor(globalCurveColor);
 			drawDoubleGraph(g2D, curve.points);
+			g2D.setColor(zeroLineColor);
+			g2D.setStroke(new BasicStroke(1));
+			drawDoubleGraph(g2D, curve.zeroLinePoints);
 		});
 	}
 
@@ -607,6 +618,9 @@ public class UnitGraph extends JPanel implements MouseListener, MouseMotionListe
 			for (UnitGraphPoint p : curve.points) {
 				p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
 			}
+			for (UnitGraphPoint p : curve.zeroLinePoints) {
+				p.calcDisplayedPosition(border, widthWithBorder, heightWithBorder);
+			}
 		});
 		
 	}

+ 2 - 7
src/ui/view/main/GUI.java

@@ -17,7 +17,6 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
-import java.awt.event.ItemEvent;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
@@ -32,14 +31,11 @@ import java.util.ListIterator;
 
 import javax.swing.AbstractAction;
 import javax.swing.ActionMap;
-import javax.swing.Box;
 import javax.swing.BoxLayout;
-import javax.swing.GrayFilter;
 import javax.swing.ImageIcon;
 import javax.swing.InputMap;
 import javax.swing.JButton;
 import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JFileChooser;
@@ -76,7 +72,6 @@ import classes.HolonObject;
 import classes.HolonSwitch;
 import classes.IdCounter;
 import classes.IdCounter.CounterType;
-import interfaces.GraphEditable;
 import ui.controller.Control;
 import ui.model.DecoratedState;
 import ui.model.Model;
@@ -91,11 +86,11 @@ import ui.view.dialog.BackgroundPopUp;
 import ui.view.dialog.CanvasResizePopUp;
 import ui.view.dialog.CreateNewDialog;
 import ui.view.dialog.CreateNewDialog.Option;
+import ui.view.dialog.EditEdgesPopUp;
+import ui.view.dialog.SearchPopUp;
 import ui.view.information.HolonInformationPanel;
 import ui.view.inspector.Inspector;
 import ui.view.inspector.UnitGraph;
-import ui.view.dialog.EditEdgesPopUp;
-import ui.view.dialog.SearchPopUp;
 import ui.view.window.AddOnWindow;
 import ui.view.window.FlexWindow;
 import ui.view.window.Outliner;

+ 86 - 86
src/ui/view/main/TimePanel.java

@@ -35,6 +35,8 @@ import javax.swing.plaf.basic.BasicSliderUI;
 
 import ui.controller.Control;
 import utility.ImageImport;
+import utility.listener.LostFocusListener;
+
 /**
  * This Class represents a Panel where the User can start and stop the
  * Simulation. He Can also reset the Simulation and click through every
@@ -42,29 +44,29 @@ import utility.ImageImport;
  * 
  * @author Gruppe14
  */
-public class TimePanel extends JPanel implements ActionListener{
+public class TimePanel extends JPanel implements ActionListener {
 
 	private static final long serialVersionUID = 1L;
-	private static final int MAX_ITERATIONS=100000;
+	private static final int MAX_ITERATIONS = 100000;
 	/*
 	 * variable for calculating the performance
 	 */
-	//private long performanceTime;
+	// private long performanceTime;
 	final JButton playBtn = new JButton();
 	final JButton timeResetBtn = new JButton();
 	final JButton timeForwardBtn = new JButton();
-	
+
 	final JButton timeBackwardBtn = new JButton();
 	JTextField iterationsField;
-	final JLabel iterationsLabel=new JLabel("Iterations:" , SwingConstants.CENTER);
+	final JLabel iterationsLabel = new JLabel("Iterations:", SwingConstants.CENTER);
 	JLabel hint = new JLabel("Invalid", SwingConstants.RIGHT);
 	private final JPanel btnAndSpeedPanel = new JPanel();
 	private final JPanel speedPanel = new JPanel();
 	private final JPanel timeBtnPanel = new JPanel();
-	private final JPanel iterationsPanel=new JPanel();
-	private final JPanel timePanel=new JPanel();
+	private final JPanel iterationsPanel = new JPanel();
+	private final JPanel timePanel = new JPanel();
 	private ScheduledFuture<?> futureTask;
-	//private LabelHint iterationsLblHint;
+	// private LabelHint iterationsLblHint;
 	JSlider timeSlider = new JSlider() {
 		/**
 		 *
@@ -96,7 +98,7 @@ public class TimePanel extends JPanel implements ActionListener{
 			addMouseListener(tl);
 		}
 	};
-	//private Model model;
+	// private Model model;
 	private Control controller;
 	private int dragResetIteration = 0;
 	private JLabel simSpeedLabel = new JLabel("Speed:");
@@ -107,10 +109,8 @@ public class TimePanel extends JPanel implements ActionListener{
 	/**
 	 * Constructor.
 	 * 
-	 * @param mod
-	 *            the Model
-	 * @param cont
-	 *            the Controller
+	 * @param mod  the Model
+	 * @param cont the Controller
 	 */
 	public TimePanel(Control cont) {
 		super();
@@ -136,8 +136,8 @@ public class TimePanel extends JPanel implements ActionListener{
 		// Slider
 		timeSlider.setPaintTicks(true);
 		timeSlider.setPaintLabels(true);
-		timeSlider.setMajorTickSpacing((int)Math.ceil(((double)cont.getModel().getMaxIterations())/20));
-		timeSlider.setMinorTickSpacing((int)Math.ceil(((double)cont.getModel().getMaxIterations())/100));
+		timeSlider.setMajorTickSpacing((int) Math.ceil(((double) cont.getModel().getMaxIterations()) / 20));
+		timeSlider.setMinorTickSpacing((int) Math.ceil(((double) cont.getModel().getMaxIterations()) / 100));
 		timeSlider.setToolTipText("Time Slider");
 		timeSlider.setMaximum(cont.getModel().getMaxIterations() - 1);
 		timeSlider.setValue(0);
@@ -171,25 +171,22 @@ public class TimePanel extends JPanel implements ActionListener{
 		playBtn.setContentAreaFilled(false);
 		playBtn.setBorderPainted(false);
 		playBtn.setBorder(null);
-		playBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/play.png",30,30)));
+		playBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/play.png", 30, 30)));
 		playBtn.addActionListener(new ActionListener() {
 			@Override
 			public void actionPerformed(ActionEvent e) {
-				if(cont.getModel().getCurrentIteration()==cont.getModel().getMaxIterations()-1)timeSlider.setValue(timeSlider.getMinimum());
+				if (cont.getModel().getCurrentIteration() == cont.getModel().getMaxIterations() - 1)
+					timeSlider.setValue(timeSlider.getMinimum());
 				running = !running;
 				if (running) {
 					timer.setDelay(cont.getModel().getTimerSpeed());
 
 					/*
-					 * start the Performance Test
-					 * /
-					performanceTime = System.nanoTime();
-					timeSlider.setValue(0);
-					timer.setDelay(0);
-					speedSlider.setValue(10);
-					timeSlider.setValue(0);
-					//*/
-					
+					 * start the Performance Test / performanceTime = System.nanoTime();
+					 * timeSlider.setValue(0); timer.setDelay(0); speedSlider.setValue(10);
+					 * timeSlider.setValue(0); //
+					 */
+
 					timer.start();
 					playBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/pause.png", 30, 30)));
 				} else {
@@ -218,7 +215,7 @@ public class TimePanel extends JPanel implements ActionListener{
 
 		timeForwardBtn.setContentAreaFilled(false);
 		timeForwardBtn.setBorder(null);
-		timeForwardBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/forward.png",30,30)));
+		timeForwardBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/forward.png", 30, 30)));
 		timeForwardBtn.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent ae) {
 				timeSlider.setValue(timeSlider.getValue() + 1);
@@ -228,7 +225,7 @@ public class TimePanel extends JPanel implements ActionListener{
 		timeBackwardBtn.setToolTipText("Backward");
 
 		timeBackwardBtn.setBorder(null);
-		timeBackwardBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/backward.png", 30,30)));
+		timeBackwardBtn.setIcon(new ImageIcon(ImageImport.loadImage("/Button_Images/backward.png", 30, 30)));
 		timeBackwardBtn.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent ae) {
 				timeSlider.setValue(timeSlider.getValue() - 1);
@@ -250,34 +247,32 @@ public class TimePanel extends JPanel implements ActionListener{
 		speedSlider.setMaximum(6);
 		speedSlider.setMinimum(0);
 		speedSlider.setValue(1);
-		
+
 		speedSlider.setPaintLabels(true);
 		Hashtable<Integer, JLabel> table = new Hashtable<Integer, JLabel>();
-		table.put (0, new JLabel("1x"));
-		table.put (1, new JLabel("2x"));
-		table.put (2, new JLabel("4x"));
-		table.put (3, new JLabel("8x"));
-		table.put (4, new JLabel("16x"));
-		table.put (5, new JLabel("32x"));
-		table.put (6, new JLabel("64x"));
-		    
+		table.put(0, new JLabel("1x"));
+		table.put(1, new JLabel("2x"));
+		table.put(2, new JLabel("4x"));
+		table.put(3, new JLabel("8x"));
+		table.put(4, new JLabel("16x"));
+		table.put(5, new JLabel("32x"));
+		table.put(6, new JLabel("64x"));
+
 		speedSlider.setLabelTable(table);
-		
+
 		speedSlider.addChangeListener(new ChangeListener() {
 			@Override
 			public void stateChanged(ChangeEvent e) {
 				/**
-				 * Shifting Powers of two:
-				 * e.g. 1<<0 -> 1 step per Second
-				 *      1<<3 -> 8 steps per Second
-				 *      and so on,
+				 * Shifting Powers of two: e.g. 1<<0 -> 1 step per Second 1<<3 -> 8 steps per
+				 * Second and so on,
 				 */
 				int calculationsPerSecond = 1 << speedSlider.getValue();
 				controller.setTimerSpeed(1024 >> speedSlider.getValue());
 				speedSlider.setToolTipText("Speed: " + calculationsPerSecond + " Calculations per Second.");
 			}
 		});
-		
+
 		speedSlider.setToolTipText("Change the Number of Calculations per Secons");
 
 		// Buttons and Speed Panel
@@ -292,52 +287,48 @@ public class TimePanel extends JPanel implements ActionListener{
 		c.gridx = 0;
 		c.gridy = 0;
 		iterationsPanel.add(iterationsLabel, c);
-		//iterationsLblHint=new LabelHint(iterationsLabel);
+		// iterationsLblHint=new LabelHint(iterationsLabel);
 		hint.setForeground(Color.red);
 		hint.setText(" ");
-		iterationsField=new JTextField(6);//Considering hundreds of thousands in an extreme case
-		iterationsField.setText(""+cont.getModel().getMaxIterations());
-		iterationsField.setToolTipText("0-" + MAX_ITERATIONS  );
+		iterationsField = new JTextField(6);// Considering hundreds of thousands in an extreme case
+		iterationsField.setText("" + cont.getModel().getMaxIterations());
+		iterationsField.setToolTipText("0-" + MAX_ITERATIONS);
 		iterationsField.addActionListener(this);
 		ScheduledThreadPoolExecutor s = new ScheduledThreadPoolExecutor(1);
-		iterationsField.addCaretListener((e)->
-			{
-				try{
-					iterationsField.setBackground(Color.WHITE);//red stings
-					if(futureTask != null){
-						futureTask.cancel(true);
-					}
-					futureTask = s.schedule((Runnable)() -> updateIterationsInput(), 1, TimeUnit.SECONDS);
-					hint.setText(" ");
-				}catch(NumberFormatException n){
-					iterationsField.setBackground(GUI.PALE_RED);//red stings
-					hint.setText("Invalid");
+		iterationsField.addCaretListener((e) -> {
+			try {
+				iterationsField.setBackground(Color.WHITE);// red stings
+				if (futureTask != null) {
+					futureTask.cancel(true);
 				}
+				futureTask = s.schedule((Runnable) () -> updateIterationsInput(), 1, TimeUnit.SECONDS);
+				hint.setText(" ");
+			} catch (NumberFormatException n) {
+				iterationsField.setBackground(GUI.PALE_RED);// red stings
+				hint.setText("Invalid");
 			}
-		);
-		iterationsField.addFocusListener((interfaces.FocusListener)(e) ->{
-			//FocusLost is not defined in interface have to be defined here
-			updateIterationsInput();
 		});
+		iterationsField.addFocusListener((LostFocusListener) (e) -> updateIterationsInput());
 		c.gridy = 1;
 		iterationsPanel.add(iterationsField, c);
 		c.gridy = 2;
 		iterationsPanel.add(hint, c);
-		//iterationsPanel.add(new JLabel(), BorderLayout.SOUTH);
-		timePanel.setLayout(new BorderLayout());;
+		// iterationsPanel.add(new JLabel(), BorderLayout.SOUTH);
+		timePanel.setLayout(new BorderLayout());
+		;
 		timePanel.add(iterationsPanel, BorderLayout.WEST);
 		timePanel.add(timeSlider, BorderLayout.CENTER);
 		this.add(btnAndSpeedPanel, BorderLayout.WEST);
 		add(timePanel);
-		
-		//Disable Keys
+
+		// Disable Keys
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "UP_ARROW");
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "DOWN_ARROW");
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0, false), "PAGE_DOWN");
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0, false), "PAGE_UP");
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0, false), "END");
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0, false), "HOME");
-		
+
 		// Left arrow Key
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "LEFT_ARROW");
 		timeSlider.getActionMap().put("LEFT_ARROW", new AbstractAction() {
@@ -349,8 +340,8 @@ public class TimePanel extends JPanel implements ActionListener{
 				controller.resetSimulation();
 			}
 		});
-		
-		//Right arrow Key
+
+		// Right arrow Key
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "Right_ARROW");
 		timeSlider.getActionMap().put("Right_ARROW", new AbstractAction() {
 			private static final long serialVersionUID = 1L;
@@ -375,25 +366,34 @@ public class TimePanel extends JPanel implements ActionListener{
 	public void actionPerformed(ActionEvent arg0) {
 		updateIterationsInput();
 	}
+
 	/**
-	 *  Update the Text field and apply valid changes to update Iterations from to model.
-	 *  <p>
-	 *  Executed by user input.
+	 * Update the Text field and apply valid changes to update Iterations from to
+	 * model.
+	 * <p>
+	 * Executed by user input.
 	 */
 	private void updateIterationsInput() {
-		try{
-			int iterations=Integer.parseInt(iterationsField.getText());
-			//iterationsLblHint.reset();
-			boolean resetField=true;
-			if(iterations<1)iterations=1;
-			else if(iterations>MAX_ITERATIONS)iterations=MAX_ITERATIONS;
-			else resetField=false;
-			if(resetField)iterationsField.setText(""+iterations);
+		try {
+			int iterations = Integer.parseInt(iterationsField.getText());
+			// iterationsLblHint.reset();
+			boolean resetField = true;
+			if (iterations < 1)
+				iterations = 1;
+			else if (iterations > MAX_ITERATIONS)
+				iterations = MAX_ITERATIONS;
+			else
+				resetField = false;
+			if (resetField)
+				iterationsField.setText("" + iterations);
 			controller.getModel().setIterations(Integer.parseInt(iterationsField.getText()));
-			timeSlider.setMaximum(controller.getModel().getMaxIterations()-1);
-			timeSlider.setLabelTable(null);//Otherwise the ticks won't update
-			timeSlider.setMajorTickSpacing((int)Math.ceil(((double)iterations)/20));
-			timeSlider.setMinorTickSpacing((int)Math.ceil(((double)iterations)/100));//Even though the final mark can't actually be reached.
-		}catch(NumberFormatException e){}
+			timeSlider.setMaximum(controller.getModel().getMaxIterations() - 1);
+			timeSlider.setLabelTable(null);// Otherwise the ticks won't update
+			timeSlider.setMajorTickSpacing((int) Math.ceil(((double) iterations) / 20));
+			timeSlider.setMinorTickSpacing((int) Math.ceil(((double) iterations) / 100));// Even though the final mark
+																							// can't actually be
+																							// reached.
+		} catch (NumberFormatException e) {
+		}
 	}
 }

+ 1 - 1
src/utility/events/LostFocusListener.java → src/utility/listener/LostFocusListener.java

@@ -1,4 +1,4 @@
-package utility.events;
+package utility.listener;
 
 import java.awt.event.FocusEvent;
 import java.awt.event.FocusListener;

+ 15 - 0
src/utility/listener/ResizeListener.java

@@ -0,0 +1,15 @@
+package utility.listener;
+
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+
+@FunctionalInterface
+public interface ResizeListener extends ComponentListener{
+	void update(ComponentEvent e); 
+	default void componentResized(ComponentEvent e) {
+		update(e);
+	}
+	default void componentMoved(ComponentEvent e) {}
+	default void componentHidden(ComponentEvent e) {}
+	default void componentShown(ComponentEvent e) {}
+}

+ 1 - 1
src/utility/events/SimpleDocumentListener.java → src/utility/listener/SimpleDocumentListener.java

@@ -1,4 +1,4 @@
-package utility.events;
+package utility.listener;
 
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;