diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..ac1a3dea --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..aa00ffab --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..712ab9d9 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..2738f8ef --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/com/stir/cscu9t4practical1/CycleEntry.java b/src/main/java/com/stir/cscu9t4practical1/CycleEntry.java new file mode 100644 index 00000000..d36ba80e --- /dev/null +++ b/src/main/java/com/stir/cscu9t4practical1/CycleEntry.java @@ -0,0 +1,38 @@ +package com.stir.cscu9t4practical1; + +public class CycleEntry extends Entry{ + + + + private String terrain; + + + + private String tempo; + public CycleEntry(String n, int d, int m, int y, int h, int min, int s, float dist,String terrain,String tempo) { + super(n, d, m, y, h, min, s, dist); + this.terrain = terrain; + this.tempo = tempo; + } + public String getTerrain() { + return terrain; + } + + public void setTerrain(String terrain) { + this.terrain = terrain; + } + public String getTempo() { + return tempo; + } + + public void setTempo(String tempo) { + this.tempo = tempo; + } + public String getEntry(){ + String result = getName()+ " did a " + getTerrain() +" cycle for " + + getDistance()+ " km in at a tempo of "+ getTempo() +" for " + +getHour()+":"+getMin()+":"+ getSec() + " on " + +getDay()+"/"+getMonth()+"/"+getYear()+"\n"; + return result; + } +} diff --git a/src/main/java/com/stir/cscu9t4practical1/Entry.java b/src/main/java/com/stir/cscu9t4practical1/Entry.java index 344b9068..7a051c40 100755 --- a/src/main/java/com/stir/cscu9t4practical1/Entry.java +++ b/src/main/java/com/stir/cscu9t4practical1/Entry.java @@ -3,9 +3,10 @@ import java.util.Calendar; public class Entry { - private String name; - private Calendar dateAndTime; - private float distance; + + protected String name; + protected Calendar dateAndTime; + protected float distance; public Entry (String n, int d, int m, int y, int h, int min, int s, float dist) { name = n; @@ -14,7 +15,7 @@ public Entry (String n, int d, int m, int y, int h, int min, int s, float dist) dateAndTime = inst; distance = dist; } //constructor - + public String getName () { return name; } //getName @@ -49,10 +50,10 @@ public float getDistance () { } //getYear public String getEntry () { - String result = getName()+" ran " + getDistance() + " km in " - +getHour()+":"+getMin()+":"+ getSec() + " on " - +getDay()+"/"+getMonth()+"/"+getYear()+"\n"; - return result; + String result = getName()+ " ran "+ getDistance() + " km in " + +getHour()+":"+getMin()+":"+ getSec() + " on " + +getDay()+"/"+getMonth()+"/"+getYear()+"\n"; + return result; } //getEntry - + } // Entry \ No newline at end of file diff --git a/src/main/java/com/stir/cscu9t4practical1/SprintEntry.java b/src/main/java/com/stir/cscu9t4practical1/SprintEntry.java new file mode 100644 index 00000000..cb78f39e --- /dev/null +++ b/src/main/java/com/stir/cscu9t4practical1/SprintEntry.java @@ -0,0 +1,30 @@ +package com.stir.cscu9t4practical1; + +public class SprintEntry extends Entry{ + + + private int repetitions; + + + private int recoveryIntervals; + public SprintEntry(String n, int d, int m, int y, int h, int min, int s, float dist,int repetitions,int recoveryIntervals){ + super(n,d,m,y,h,min,s,dist); + this.repetitions = repetitions; + this.recoveryIntervals = recoveryIntervals; + }public int getRepetitions() { + return repetitions; + } + + public int getRecovery() { + return recoveryIntervals; + } + + + public String getEntry(){ + String result = getName()+ " Sprinted " + getRepetitions() +" repetitions of: " + + getDistance()+ " km in With breaks of "+ getRecovery() +" mins in between " + +getHour()+":"+getMin()+":"+ getSec() + " on " + +getDay()+"/"+getMonth()+"/"+getYear()+"\n"; + return result; + } +} diff --git a/src/main/java/com/stir/cscu9t4practical1/SwimEntry.java b/src/main/java/com/stir/cscu9t4practical1/SwimEntry.java new file mode 100644 index 00000000..dd8e2c3c --- /dev/null +++ b/src/main/java/com/stir/cscu9t4practical1/SwimEntry.java @@ -0,0 +1,24 @@ +package com.stir.cscu9t4practical1; + +public class SwimEntry extends Entry{ + + private String where; + public SwimEntry(String n, int d, int m, int y, int h, int min, int s, float dist,String where) { + super(n, d, m, y, h, min, s, dist); + this.where = where; + } + public String getWhere() { + return where; + } + + public void setWhere(String where) { + this.where = where; + } + public String getEntry(){ + String result = getName()+ " Swam " + getWhere() +" for " + + getDistance()+ " km in " + +getHour()+":"+getMin()+":"+ getSec() + " on " + +getDay()+"/"+getMonth()+"/"+getYear()+"\n"; + return result; + } +} diff --git a/src/main/java/com/stir/cscu9t4practical1/TrainingRecord.java b/src/main/java/com/stir/cscu9t4practical1/TrainingRecord.java index fafdec9b..5dd17bb4 100755 --- a/src/main/java/com/stir/cscu9t4practical1/TrainingRecord.java +++ b/src/main/java/com/stir/cscu9t4practical1/TrainingRecord.java @@ -30,7 +30,48 @@ public String lookupEntry (int d, int m, int y) { } return result; } // lookupEntry - + public String lookupAllEntries (int d, int m, int y) { + ListIterator iter = tr.listIterator(); + String result = ""; + while (iter.hasNext()) { + Entry current = iter.next(); + if (current.getDay()==d && current.getMonth()==m && current.getYear()==y) + result += current.getEntry(); + } + return result; + } + public Boolean CheckIfEntryExists (int d, int m, int y,String name) { + ListIterator iter = tr.listIterator(); + Boolean result = false; + while (iter.hasNext()) { + Entry current = iter.next(); + if (current.getDay()==d && current.getMonth()==m && current.getYear()==y && current.getName().equalsIgnoreCase(name)) + result = true; + } + return result; + } + public String lookupAllEntriesByName(String searchTerm){ + ListIterator iter = tr.listIterator(); + String result = ""; + while (iter.hasNext()) { + Entry current = iter.next(); + if (current.name.equalsIgnoreCase(searchTerm)){ + result += current.getEntry(); + } + } + return result; + } + public String removeAllEntries (int d, int m, int y,String n) { + ListIterator iter = tr.listIterator(); + String result = "No entries under that name and date"; + while (iter.hasNext()) { + Entry current = iter.next(); + if (current.getDay()==d && current.getMonth()==m && current.getYear()==y && current.getName().equalsIgnoreCase(n)) + result = "Entry: "+n+ " on " +d+"/"+m+"/"+y+" was removed successfully"; + iter.remove(); + } + return result; + } // Count the number of entries public int getNumberOfEntries(){ return tr.size(); diff --git a/src/main/java/com/stir/cscu9t4practical1/TrainingRecordGUI.java b/src/main/java/com/stir/cscu9t4practical1/TrainingRecordGUI.java index cbb891a1..921da7a2 100755 --- a/src/main/java/com/stir/cscu9t4practical1/TrainingRecordGUI.java +++ b/src/main/java/com/stir/cscu9t4practical1/TrainingRecordGUI.java @@ -5,6 +5,8 @@ import java.awt.event.*; import java.util.*; import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.lang.Number; public class TrainingRecordGUI extends JFrame implements ActionListener { @@ -27,10 +29,19 @@ public class TrainingRecordGUI extends JFrame implements ActionListener { private JLabel labdist = new JLabel(" Distance (km):"); private JButton addR = new JButton("Add"); private JButton lookUpByDate = new JButton("Look Up"); + private JButton lookUpAllByDate = new JButton("Look Up All"); private TrainingRecord myAthletes = new TrainingRecord(); private JTextArea outputArea = new JTextArea(5, 50); + private JTextField whereField = new JTextField(10); + private JTextField repetitionsField = new JTextField(3); + private JTextField recoveryField = new JTextField(3); + + private JTextField tempoField = new JTextField(3); + private JTextField terrainField = new JTextField(10); + private JButton findAllBasedOnName = new JButton("Name Search"); + private JButton removeButton = new JButton("Remove Entry"); public static void main(String[] args) { TrainingRecordGUI applic = new TrainingRecordGUI(); @@ -64,12 +75,32 @@ public TrainingRecordGUI() { add(labdist); add(dist); dist.setEditable(true); + add(new JLabel("---Swimming---")); + add(new JLabel("Outdoor or Indoor:")); + add(whereField); + add(new JLabel("---Sprinting---")); + add(new JLabel("Repetitions:")); + add(repetitionsField); + add(new JLabel("Recovery Intervals(mins):")); + add(recoveryField); + add(new JLabel("---Cycling---")); + add(new JLabel("Terrain:")); + add(terrainField); + add(new JLabel("Tempo(mph):")); + add(tempoField); add(addR); addR.addActionListener(this); add(lookUpByDate); lookUpByDate.addActionListener(this); + add(lookUpAllByDate); + lookUpAllByDate.addActionListener(this); + add(findAllBasedOnName); + findAllBasedOnName.addActionListener(this); + add(removeButton); + removeButton.addActionListener(this); add(outputArea); outputArea.setEditable(false); + setSize(720, 200); setVisible(true); blankDisplay(); @@ -88,13 +119,20 @@ public void actionPerformed(ActionEvent event) { if (event.getSource() == lookUpByDate) { message = lookupEntry(); } + if (event.getSource() == lookUpAllByDate) { + message = lookupAllEntries(); + } + if (event.getSource() == findAllBasedOnName){ + message = lookupAllEntriesByName(); + } if (event.getSource() == removeButton){ + message = removeAllEntries(); + } outputArea.setText(message); blankDisplay(); } // actionPerformed public String addEntry(String what) { - String message = "Record added\n"; - System.out.println("Adding "+what+" entry to the records"); + String message = "adding..."; String n = name.getText(); int m = Integer.parseInt(month.getText()); int d = Integer.parseInt(day.getText()); @@ -103,9 +141,34 @@ public String addEntry(String what) { int h = Integer.parseInt(hours.getText()); int mm = Integer.parseInt(mins.getText()); int s = Integer.parseInt(secs.getText()); - Entry e = new Entry(n, d, m, y, h, mm, s, km); - myAthletes.addEntry(e); - return message; + String terrain = terrainField.getText(); + String tempo = tempoField.getText(); + String where = whereField.getText(); + String repetitions = repetitionsField.getText(); + String recovery = recoveryField.getText(); + if (myAthletes.CheckIfEntryExists(m,d,y,n) == false) { + if (!terrain.isEmpty() && !tempo.isEmpty()) { + CycleEntry e = new CycleEntry(n, d, m, y, h, mm, s, km, terrain, tempo); + myAthletes.addEntry(e); + System.out.print("Added as cycle"); + } else if (!where.isEmpty()) { + SwimEntry e = new SwimEntry(n, d, m, y, h, mm, s, km, where); + myAthletes.addEntry(e); + System.out.print("Added as swim"); + } else if (!repetitions.isEmpty() && !recovery.isEmpty()) { + SprintEntry e = new SprintEntry(n, d, m, y, h, mm, s, km, Integer.parseInt(repetitions), Integer.parseInt(recovery)); + myAthletes.addEntry(e); + System.out.print("Added as sprint"); + } else { + Entry e = new Entry(n, d, m, y, h, mm, s, km); + myAthletes.addEntry(e); + message = "Record added as run"; + } + return message; + }else { + message = "An entry under this name and date already exists"; + return message; + } } public String lookupEntry() { @@ -116,6 +179,29 @@ public String lookupEntry() { String message = myAthletes.lookupEntry(d, m, y); return message; } + public String lookupAllEntries() { + int m = Integer.parseInt(month.getText()); + int d = Integer.parseInt(day.getText()); + int y = Integer.parseInt(year.getText()); + outputArea.setText("looking up record ..."); + String message = myAthletes.lookupAllEntries(d, m, y); + return message; + } + public String lookupAllEntriesByName(){ + String searchTerm = name.getText(); + outputArea.setText("looking up record ..."); + String message = myAthletes.lookupAllEntriesByName(searchTerm); + return message; + } + public String removeAllEntries() { + int m = Integer.parseInt(month.getText()); + int d = Integer.parseInt(day.getText()); + int y = Integer.parseInt(year.getText()); + String n = name.getText(); + outputArea.setText("looking up record ..."); + String message = myAthletes.removeAllEntries(d, m, y,n); + return message; + } public void blankDisplay() { name.setText(""); @@ -126,7 +212,11 @@ public void blankDisplay() { mins.setText(""); secs.setText(""); dist.setText(""); - + recoveryField.setText(""); + terrainField.setText(""); + repetitionsField.setText(""); + tempoField.setText(""); + whereField.setText(""); }// blankDisplay // Fills the input fields on the display for testing purposes only public void fillDisplay(Entry ent) { diff --git a/src/test/java/com/stir/cscu9t4practical1/CycleEntryTest.java b/src/test/java/com/stir/cscu9t4practical1/CycleEntryTest.java index de457810..37c2fdab 100644 --- a/src/test/java/com/stir/cscu9t4practical1/CycleEntryTest.java +++ b/src/test/java/com/stir/cscu9t4practical1/CycleEntryTest.java @@ -139,7 +139,7 @@ public void testGetDistance() { @Test public void testGetTerrain() { System.out.println("getTerrain"); - Entry instance = new CycleEntry("Alice", 1, 2, 2003, 0, 16, 7, 3, "asphalt", "moderate"); + CycleEntry instance = new CycleEntry("Alice", 1, 2, 2003, 0, 16, 7, 3, "asphalt", "moderate"); String expResult = "asphalt"; String result = instance.getTerrain(); assertEquals(expResult, result); @@ -151,7 +151,7 @@ public void testGetTerrain() { @Test public void testGetTempo() { System.out.println("getTempo"); - Entry instance = new CycleEntry("Alice", 1, 2, 2003, 0, 16, 7, 3, "asphalt", "moderate"); + CycleEntry instance = new CycleEntry("Alice", 1, 2, 2003, 0, 16, 7, 3, "asphalt", "moderate"); String expResult = "moderate"; String result = instance.getTempo(); assertEquals(expResult, result); @@ -164,7 +164,7 @@ public void testGetTempo() { public void testGetEntry() { System.out.println("getEntry"); Entry instance = new CycleEntry("Alice", 1, 2, 2003, 0, 16, 7, 3, "asphalt", "moderate"); - String expResult = "Alice cycled 3.0 km in 0:16:7 on 1/2/2003 on asphalt at moderate tempo\n"; + String expResult = "Alice did a asphalt cycle for 3.0 km in at a tempo of moderate for 0:16:7 on 1/2/2003\n"; String result = instance.getEntry(); assertEquals(expResult, result); } diff --git a/src/test/java/com/stir/cscu9t4practical1/SprintEntryTest.java b/src/test/java/com/stir/cscu9t4practical1/SprintEntryTest.java index 00af5583..7b2976d9 100644 --- a/src/test/java/com/stir/cscu9t4practical1/SprintEntryTest.java +++ b/src/test/java/com/stir/cscu9t4practical1/SprintEntryTest.java @@ -127,7 +127,7 @@ public void testGetSec() { public void testGetDistance() { System.out.println("getDistance"); Entry instance = new SprintEntry("Alice", 1, 2, 2003, 0, 16, 7, 300, 4, 2); - float expResult = 3.0F; + float expResult = 300F; float result = instance.getDistance(); assertEquals(expResult, result, 0.0); } @@ -138,10 +138,10 @@ public void testGetDistance() { @Test public void testGetRepetitions() { System.out.println("getRepetitions"); - Entry instance = new SprintEntry("Alice", 1, 2, 2003, 0, 16, 7, 300, 4, 2); + SprintEntry instance = new SprintEntry("Alice", 1, 2, 2003, 0, 16, 7, 300, 4, 2); int expResults = 4; int result = instance.getRepetitions(); - assertEquals(expResult, result); + assertEquals(expResults, result); } /** @@ -150,10 +150,10 @@ public void testGetRepetitions() { @Test public void testGetRecovery() { System.out.println("getRepetitions"); - Entry instance = new SprintEntry("Alice", 1, 2, 2003, 0, 16, 7, 300, 4, 2); + SprintEntry instance = new SprintEntry("Alice", 1, 2, 2003, 0, 16, 7, 300, 4, 2); int expResults = 2; int result = instance.getRecovery(); - assertEquals(expResult, result); + assertEquals(expResults, result); } /** @@ -163,7 +163,7 @@ public void testGetRecovery() { public void testGetEntry() { System.out.println("getEntry"); Entry instance = new SprintEntry("Alice", 1, 2, 2003, 0, 16, 7, 300, 4, 2); - String expResult = "Alice sprinted 4x300m in 0:16:7 with 2 minutes recovery on 1/2/2003\n"; + String expResult = "Alice Sprinted 4 repetitions of: 300.0 km in With breaks of 2 mins in between 0:16:7 on 1/2/2003\n"; String result = instance.getEntry(); assertEquals(expResult, result); } diff --git a/src/test/java/com/stir/cscu9t4practical1/SwimEntryTest.java b/src/test/java/com/stir/cscu9t4practical1/SwimEntryTest.java index 19a4650c..3b76c15a 100644 --- a/src/test/java/com/stir/cscu9t4practical1/SwimEntryTest.java +++ b/src/test/java/com/stir/cscu9t4practical1/SwimEntryTest.java @@ -140,13 +140,13 @@ public void testGetWhere() { System.out.println("getWhere"); Entry instanceA = new SwimEntry("Alice", 1, 2, 2003, 0, 16, 7, 3,"outdoors"); String expResultA = "outdoors"; - String result = instanceA.getWhere(); - assertEquals(expResultA, result); + String result1 = ((SwimEntry) instanceA).getWhere(); + assertEquals(expResultA, result1); Entry instanceB = new SwimEntry("Alice", 1, 2, 2003, 0, 16, 7, 3,"pool"); - String expResultB = "in a pool"; - String result = instanceB.getWhere(); - assertEquals(expResultB, result); + String expResultB = "pool"; + String result2 = ((SwimEntry) instanceB).getWhere(); + assertEquals(expResultB, result2); } /** * Test of getEntry method, of class SwimEntry. @@ -155,7 +155,7 @@ public void testGetWhere() { public void testGetEntry() { System.out.println("getEntry"); Entry instance = new SwimEntry("Alice", 1, 2, 2003, 0, 16, 7, 3,"outdoors"); - String expResult = "Alice swam 3.0 km outdoors in 0:16:7 on 1/2/2003\n"; + String expResult = "Alice Swam outdoors for 3.0 km in 0:16:7 on 1/2/2003\n"; String result = instance.getEntry(); assertEquals(expResult, result); } diff --git a/src/test/java/com/stir/cscu9t4practical1/TrainingRecordGUITest.java b/src/test/java/com/stir/cscu9t4practical1/TrainingRecordGUITest.java index ce2c04db..91fb007b 100644 --- a/src/test/java/com/stir/cscu9t4practical1/TrainingRecordGUITest.java +++ b/src/test/java/com/stir/cscu9t4practical1/TrainingRecordGUITest.java @@ -92,18 +92,48 @@ public void testAddEntry(){ instance.fillDisplay(entry); String message = instance.addEntry("generic"); System.out.println(message); - assertEquals(message,"Record added\n"); + assertEquals(message,"Record added as run"); + } + @Test + public void testLookupAllEntries(){ + TrainingRecordGUI instance = new TrainingRecordGUI(); + Entry entry = new Entry("Alice", 1, 2, 2003, 0, 16, 7, 3); + instance.fillDisplay(entry); + String expected = "Alice ran 3.0 km in 0:16:7 on 1/2/2003\n"; + String message = instance.addEntry("generic"); + message = instance.lookupAllEntries(); + assertEquals(message,expected); } /** * Test to see if all display requirements have been met */ @Test + public void testRemoveAllEntries(){ + TrainingRecordGUI instance = new TrainingRecordGUI(); + Entry entry = new Entry("Alice", 1, 2, 2003, 0, 16, 7, 3); + instance.fillDisplay(entry); + instance.addEntry("generic"); + String result = instance.removeAllEntries(); + String expected = "Entry: Alice on 1/2/2003 was removed successfully"; + assertEquals(result,expected); + } + @Test + public void testLookupAllEntriesByName(){ + TrainingRecordGUI instance = new TrainingRecordGUI(); + Entry entry = new Entry("Alice", 1, 2, 2003, 0, 16, 7, 3); + instance.fillDisplay(entry); + instance.addEntry("generic"); + String result = instance.lookupAllEntriesByName(); + String expected = "Alice ran 3.0 km in 0:16:7 on 1/2/2003\n"; + assertEquals(result,expected); + } + @Test public void testButtonsPresentInGUI() throws IllegalAccessException, IllegalArgumentException{ System.out.println("Check if you have added the buttons"); TrainingRecordGUI instance = new TrainingRecordGUI(); Class instanceClass = instance.getClass(); - String[] expectedFields = {"findAllByDate","lookUpByDate"}; // add RemoveEntry when it is ready + String[] expectedFields = {"lookUpAllByDate","lookUpByDate","findAllBasedOnName","removeButton"}; // add RemoveEntry when it is ready Field fields[] = instanceClass.getDeclaredFields(); int found = 0; for (Field field : fields) { diff --git a/target/classes/com/stir/cscu9t4practical1/CycleEntry.class b/target/classes/com/stir/cscu9t4practical1/CycleEntry.class new file mode 100644 index 00000000..043b4309 Binary files /dev/null and b/target/classes/com/stir/cscu9t4practical1/CycleEntry.class differ diff --git a/target/classes/com/stir/cscu9t4practical1/Entry.class b/target/classes/com/stir/cscu9t4practical1/Entry.class new file mode 100644 index 00000000..09120b7c Binary files /dev/null and b/target/classes/com/stir/cscu9t4practical1/Entry.class differ diff --git a/target/classes/com/stir/cscu9t4practical1/SprintEntry.class b/target/classes/com/stir/cscu9t4practical1/SprintEntry.class new file mode 100644 index 00000000..0c717bba Binary files /dev/null and b/target/classes/com/stir/cscu9t4practical1/SprintEntry.class differ diff --git a/target/classes/com/stir/cscu9t4practical1/SwimEntry.class b/target/classes/com/stir/cscu9t4practical1/SwimEntry.class new file mode 100644 index 00000000..fc91e487 Binary files /dev/null and b/target/classes/com/stir/cscu9t4practical1/SwimEntry.class differ diff --git a/target/classes/com/stir/cscu9t4practical1/TrainingRecord.class b/target/classes/com/stir/cscu9t4practical1/TrainingRecord.class new file mode 100644 index 00000000..a5efea7c Binary files /dev/null and b/target/classes/com/stir/cscu9t4practical1/TrainingRecord.class differ diff --git a/target/classes/com/stir/cscu9t4practical1/TrainingRecordGUI.class b/target/classes/com/stir/cscu9t4practical1/TrainingRecordGUI.class new file mode 100644 index 00000000..ceaf64df Binary files /dev/null and b/target/classes/com/stir/cscu9t4practical1/TrainingRecordGUI.class differ