Added GUIGenerator for introspection and a feedback file of the first challenge.
- Author
- Maarten Vangeneugden
- Date
- Dec. 11, 2015, 5:40 p.m.
- Hash
- 8ee0e9d7bb2106b254ef640722436cd292d74ec3
- Parent
- 480a1a63f145edc213dde0103ad8f56c19246ec5
- Modified files
- 07/GUIGenerator/DOMUIParser.java
- 07/GUIGenerator/InvalidXMLException.java
- 07/GUIGenerator/input/1.xml
- 07/GUIGenerator/input/2.xml
- 07/GUIGenerator/input/3.xml
- 07/GUIGenerator/input/4.xml
- 07/GUIGenerator/main.java
- Challenge/feedback
07/GUIGenerator/DOMUIParser.java ¶
107 additions and 0 deletions.
View changes Hide changes
+ |
1 |
|
+ |
2 |
import java.awt.GridLayout; |
+ |
3 |
import java.awt.LayoutManager; |
+ |
4 |
import java.lang.reflect.*; |
+ |
5 |
import javax.swing.JComponent; |
+ |
6 |
import javax.swing.JFrame; |
+ |
7 |
import javax.swing.JPanel; |
+ |
8 |
|
+ |
9 |
import org.omg.CORBA.PRIVATE_MEMBER; |
+ |
10 |
import org.w3c.dom.Document; |
+ |
11 |
import org.w3c.dom.Element; |
+ |
12 |
import org.w3c.dom.Node; |
+ |
13 |
import org.w3c.dom.NodeList; |
+ |
14 |
|
+ |
15 |
public class DOMUIParser { |
+ |
16 |
private Element root; |
+ |
17 |
private JPanel app; |
+ |
18 |
private JFrame f; |
+ |
19 |
|
+ |
20 |
|
+ |
21 |
//TODO add constructor and main |
+ |
22 |
//e.g. $dparser = new org.apache.xerces.parsers.DOMParser(); |
+ |
23 |
// $document = new File(fileName); |
+ |
24 |
|
+ |
25 |
protected void buildUI(Document doc){ |
+ |
26 |
root = doc.getDocumentElement(); |
+ |
27 |
app = new JPanel(); |
+ |
28 |
processNode(root, app); |
+ |
29 |
f = new JFrame(); |
+ |
30 |
f.setTitle(getTitle()); |
+ |
31 |
f.getContentPane().add(app); |
+ |
32 |
f.pack(); |
+ |
33 |
f.setVisible(true); |
+ |
34 |
} |
+ |
35 |
|
+ |
36 |
private String getTitle() { |
+ |
37 |
NodeList children = root.getChildNodes(); |
+ |
38 |
for (int i = 0; i < children.getLength(); i++) { |
+ |
39 |
if(children.item(i).getNodeName().equals("text")) |
+ |
40 |
return children.item(i).getNodeValue(); |
+ |
41 |
} |
+ |
42 |
return null; |
+ |
43 |
} |
+ |
44 |
|
+ |
45 |
private String getLabel(Node wchild) { |
+ |
46 |
NodeList children = wchild.getChildNodes(); |
+ |
47 |
for (int i = 0; i < children.getLength(); i++) { |
+ |
48 |
if(children.item(i).getNodeName().equals("text")) |
+ |
49 |
return children.item(i).getNodeValue(); |
+ |
50 |
} |
+ |
51 |
return null; |
+ |
52 |
} |
+ |
53 |
|
+ |
54 |
private void processNode(Node n, JComponent container){ |
+ |
55 |
if(n.getNodeType()==Node.ELEMENT_NODE) |
+ |
56 |
if(processWidgetElement((Element)n, container)) return; |
+ |
57 |
NodeList nl = n.getChildNodes(); |
+ |
58 |
if(nl.getLength()>0) |
+ |
59 |
for(int i=0; i<nl.getLength(); i++) |
+ |
60 |
processNode(nl.item(i), container); |
+ |
61 |
} |
+ |
62 |
|
+ |
63 |
/* Processes a widget element, adds it to the container |
+ |
64 |
* @param e an element describing a widget |
+ |
65 |
* @param container the container to which the widget should be added |
+ |
66 |
* @return true if the descendants of e are processed by this method |
+ |
67 |
* false otherwise |
+ |
68 |
* @pre e != null |
+ |
69 |
* @pre e.getChildNodes() != null |
+ |
70 |
* @pre e.getChildNodes().getLength() > 1 |
+ |
71 |
* @pre container != null |
+ |
72 |
* */ |
+ |
73 |
private boolean processWidgetElement(Element element, JComponent container) { |
+ |
74 |
Class cl; |
+ |
75 |
Constructor ct; |
+ |
76 |
try { |
+ |
77 |
cl = Class.forName(element.getNodeName()); |
+ |
78 |
//ct = cl.getConstructor(parameterTypes) |
+ |
79 |
|
+ |
80 |
//TODO |
+ |
81 |
|
+ |
82 |
|
+ |
83 |
} catch (ClassNotFoundException e) { |
+ |
84 |
// TODO: handle exception |
+ |
85 |
} |
+ |
86 |
|
+ |
87 |
if (element == null || container == null) |
+ |
88 |
return false; |
+ |
89 |
else if (element.getChildNodes() == null) |
+ |
90 |
return false; |
+ |
91 |
else if (element.getChildNodes().getLength() < 1) |
+ |
92 |
return false; |
+ |
93 |
else { |
+ |
94 |
return true; |
+ |
95 |
} |
+ |
96 |
} |
+ |
97 |
|
+ |
98 |
private GridLayout MakeGroup(Element element){ |
+ |
99 |
GridLayout gridLayout = new GridLayout(); |
+ |
100 |
String rows = element.getAttribute("rows"); |
+ |
101 |
String columns = element.getAttribute("columns"); |
+ |
102 |
return gridLayout; |
+ |
103 |
} |
+ |
104 |
|
+ |
105 |
|
+ |
106 |
} |
+ |
107 |
07/GUIGenerator/InvalidXMLException.java ¶
11 additions and 0 deletions.
07/GUIGenerator/input/1.xml ¶
29 additions and 0 deletions.
View changes Hide changes
+ |
1 |
<title>Simple</title> |
+ |
2 |
<group name="layout" rows="1" columns="2"> |
+ |
3 |
<widget x="1" y="1"> |
+ |
4 |
<javax.swing.JButton name="left"> |
+ |
5 |
<text>Left Button</text> |
+ |
6 |
<actie> |
+ |
7 |
<method>System.out.println</method> |
+ |
8 |
<param> |
+ |
9 |
<type>java.lang.String</type> |
+ |
10 |
<value>"Left" clicked!</value> |
+ |
11 |
</param> |
+ |
12 |
</actie> |
+ |
13 |
</javax.swing.JButton> |
+ |
14 |
</widget> |
+ |
15 |
<widget x="1" y="2"> |
+ |
16 |
<javax.swing.JButton name="right"> |
+ |
17 |
<text>Right Button</text> |
+ |
18 |
<actie> |
+ |
19 |
<method>System.out.println</method> |
+ |
20 |
<param> |
+ |
21 |
<type>java.lang.String</type> |
+ |
22 |
<value>"Right" clicked!</value> |
+ |
23 |
</param> |
+ |
24 |
</actie> |
+ |
25 |
</javax.swing.JButton> |
+ |
26 |
</widget> |
+ |
27 |
</group> |
+ |
28 |
</ui> |
+ |
29 |
07/GUIGenerator/input/2.xml ¶
17 additions and 0 deletions.
View changes Hide changes
+ |
1 |
<title>UHasselt</title> |
+ |
2 |
<group name="layout" rows="2" columns="1"> |
+ |
3 |
<widget x="1" y="1"> |
+ |
4 |
<javax.swing.JSlider name="slider"> |
+ |
5 |
<setMajorTickSpacing>20</setMajorTickSpacing> |
+ |
6 |
<setPaintTicks>true</setPaintTicks> |
+ |
7 |
<setPaintLabels>true</setPaintLabels> |
+ |
8 |
</javax.swing.JSlider> |
+ |
9 |
</widget> |
+ |
10 |
<widget x="2" y="1"> |
+ |
11 |
<javax.swing.JLabel name="image"> |
+ |
12 |
<setIcon>uhasselt.png</setIcon> |
+ |
13 |
</javax.swing.JLabel> |
+ |
14 |
</widget> |
+ |
15 |
</group> |
+ |
16 |
</ui> |
+ |
17 |
07/GUIGenerator/input/3.xml ¶
21 additions and 0 deletions.
View changes Hide changes
+ |
1 |
<title>Colors</title> |
+ |
2 |
<group name="layout" rows="1" columns="2"> |
+ |
3 |
<widget x="1" y="1"> |
+ |
4 |
<javax.swing.JButton name="left"> |
+ |
5 |
<text>OK</text> |
+ |
6 |
<setBackground>0,255,0</setBackground> |
+ |
7 |
<setForeground>255,255,255</setForeground> |
+ |
8 |
<setHorizontalAlignment>left</setHorizontalAlignment> |
+ |
9 |
</javax.swing.JButton> |
+ |
10 |
</widget> |
+ |
11 |
<widget x="1" y="2"> |
+ |
12 |
<javax.swing.JButton name="right"> |
+ |
13 |
<text>Cancel</text> |
+ |
14 |
<setBackground>red</setBackground> |
+ |
15 |
<setForeground>white</setForeground> |
+ |
16 |
<setHorizontalAlignment>right</setHorizontalAlignment> |
+ |
17 |
</javax.swing.JButton> |
+ |
18 |
</widget> |
+ |
19 |
</group> |
+ |
20 |
</ui> |
+ |
21 |
07/GUIGenerator/input/4.xml ¶
57 additions and 0 deletions.
View changes Hide changes
+ |
1 |
<!-- Als dit voorbeeld werkt, ben je goed bezig! --> |
+ |
2 |
<title>Calc</title> |
+ |
3 |
<group name="layout" rows="1" columns="2"> |
+ |
4 |
<widget x="1" y="1"> |
+ |
5 |
<javax.swing.JTextField name="number"> |
+ |
6 |
<text>0</text> |
+ |
7 |
</javax.swing.JTextField> |
+ |
8 |
</widget> |
+ |
9 |
<widget x="1" y="2"> |
+ |
10 |
<group name="functions" rows="4" columns="1"> |
+ |
11 |
<widget x="1" y="1"> |
+ |
12 |
<javax.swing.JButton name="sin"> |
+ |
13 |
<text>sin</text> |
+ |
14 |
<actie> |
+ |
15 |
<method>java.lang.Math.sin</method> |
+ |
16 |
<param> |
+ |
17 |
<type>java.lang.Double</type> |
+ |
18 |
<value> |
+ |
19 |
<property name="getText" widget="number" /> |
+ |
20 |
<value> |
+ |
21 |
</param> |
+ |
22 |
</actie> |
+ |
23 |
</javax.swing.JButton> |
+ |
24 |
</widget> |
+ |
25 |
<widget x="2" y="1"> |
+ |
26 |
<javax.swing.JButton name="cos"> |
+ |
27 |
<text>cos</text> |
+ |
28 |
<actie> |
+ |
29 |
<method>java.lang.Math.cos</method> |
+ |
30 |
<param> |
+ |
31 |
<type>java.lang.Double</type> |
+ |
32 |
<value> |
+ |
33 |
<property name="getText" widget="number" /> |
+ |
34 |
<value> |
+ |
35 |
</param> |
+ |
36 |
</actie> |
+ |
37 |
</javax.swing.JButton> |
+ |
38 |
</widget> |
+ |
39 |
<widget x="3" y="1"> |
+ |
40 |
<javax.swing.JButton name="tan"> |
+ |
41 |
<text>tan</text> |
+ |
42 |
<actie> |
+ |
43 |
<method>java.lang.Math.tan</method> |
+ |
44 |
<param> |
+ |
45 |
<type>java.lang.Double</type> |
+ |
46 |
<value> |
+ |
47 |
<property name="getText" widget="number" /> |
+ |
48 |
<value> |
+ |
49 |
</param> |
+ |
50 |
</actie> |
+ |
51 |
</javax.swing.JButton> |
+ |
52 |
</widget> |
+ |
53 |
</group> |
+ |
54 |
</widget> |
+ |
55 |
</group> |
+ |
56 |
</ui> |
+ |
57 |
07/GUIGenerator/main.java ¶
19 additions and 0 deletions.
View changes Hide changes
+ |
1 |
|
+ |
2 |
import javax.swing.text.html.HTMLEditorKit.Parser; |
+ |
3 |
|
+ |
4 |
import org.w3c.dom.Document; |
+ |
5 |
|
+ |
6 |
public class main { |
+ |
7 |
|
+ |
8 |
private static DOMUIParser guiParser; |
+ |
9 |
/** |
+ |
10 |
* @param args |
+ |
11 |
*/ |
+ |
12 |
public static void main(String[] args) { |
+ |
13 |
Document doc = null; |
+ |
14 |
doc.setDocumentURI("/MyMiniGUIGenerator/input/1.xml"); |
+ |
15 |
|
+ |
16 |
} |
+ |
17 |
|
+ |
18 |
} |
+ |
19 |
Challenge/feedback ¶
49 additions and 0 deletions.
View changes Hide changes
+ |
1 |
- Gebruik encapsulatie |
+ |
2 |
- Motiveer ontwerpkeuzes (o.a. GRASP, SOLID, ...) |
+ |
3 |
- Maak gebruik van ervaring opgedaan bij de oefeningen |
+ |
4 |
- Prioriteiten stellen |
+ |
5 |
- Algemeen ontwerp en klassendiagram moet gemaakt worden |
+ |
6 |
- Duidelijk maken van hoe het moet worden geimplementeerd >> implementeren |
+ |
7 |
|
+ |
8 |
===OPDRACHT=== |
+ |
9 |
Studietrajectplanner |
+ |
10 |
|
+ |
11 |
- Opleiding, opleidingsonderdelen en studenten beheren |
+ |
12 |
- Abstractielaag (bv. interface): Enkel doen als er ook een degelijke reden voor is (In deze opdracht was dit niet echt nodig (bv. AbstractOpleiding)) |
+ |
13 |
- Postcondities zijn niet vereist als dit triviaal is (Bv. "@post De class is geconstrueerd" bij de constructor); Afweging maken tussen trivialiteit en absoluut vereiste pre/postcondities |
+ |
14 |
- Inheritance is prut als het niet moet: |
+ |
15 |
- OO_Besturingssystemen extends Opleidingsonderdeel; DIT IS GEEN SPECIALISATIE, dit is "een opleidingsonderdeel", niet "een opleidingsonderdeel dat een gespecialiseerde versie van een gewoon opleidingsonderdeel is." |
+ |
16 |
|
+ |
17 |
- Studietraject samenstellen: Manueel + automatisch aanvullen |
+ |
18 |
- Minderheid heeft dit geimplementeerd. |
+ |
19 |
- Een gegeven werkwijze is om een klassediagram te schetsen en de verantwoordelijkheden te bepalen ALVORENS te beginnen met programmeren. |
+ |
20 |
|
+ |
21 |
- Sorteeralgoritme: Samengestelde studietraject tonen en mogelijkheid om opleidingsonderdelen in dit traject alfabetisch of chronologisch weer te geven. |
+ |
22 |
- Ook weinigen die dit hebben geimplementeerd. |
+ |
23 |
- Geen gebruik maken van ingebouwde sorteeralgoritmen. |
+ |
24 |
|
+ |
25 |
- GUI voor deze functionaliteit |
+ |
26 |
- Toepassing van MVC-architectuur |
+ |
27 |
- Dit is geen structuurbeschrijving van het volledige programma |
+ |
28 |
- Geen programmalogica in GUI-gedeelte! |
+ |
29 |
|
+ |
30 |
- Pas contractueel programmeren toe |
+ |
31 |
- Zelfs bij vrij eenvoudige en triviale code toepassen |
+ |
32 |
- Voor elke method toepassen |
+ |
33 |
- Dus ook voor getters en setters |
+ |
34 |
- Echt waar |
+ |
35 |
- Alle methods |
+ |
36 |
|
+ |
37 |
- Correct gedrag, uitbreidbaarheid en robuustheid vereist |
+ |
38 |
- Het verbergen van achterliggende implementatie komt encapsulatie ten goede. |
+ |
39 |
- Creeer gepaste exceptions; Door het zelf maken van exceptions is het mogelijk om een fout duidelijk aan te geven. |
+ |
40 |
- Het extenden van Exception en overriden van getMessage() is al voldoende. |
+ |
41 |
|
+ |
42 |
- Motivatie van de ontwerpkeuzes |
+ |
43 |
- De motivatie moet niet enkel de beschrijving van de classes te maken; Class description hoort in een commentaarblok in de code. |
+ |
44 |
- Het 'waarom' uitleggen |
+ |
45 |
- Schrijf het verslag tijdens het programmeren |
+ |
46 |
- Geef ontwerpkeuzes v. SOLID en GRASP aan en geef voorbeelden die dit duidelijk maken. |
+ |
47 |
Deze opdracht ging vooral om een afweging van keuzes te oefenen. (Niemand heeft het volledig afgekregen). |
+ |
48 |
De beste manier voor deze opdrachten is om eerst te duiden op wat waar moet komen (Beschrijving van implementatie), alvorens de eigenlijke implementatie te maken. |
+ |
49 |
De beste manier voor deze opdrachten is om eerst te duiden op wat waar moet komen (Beschrijving van implementatie), alvorens de eigenlijke implementatie te maken. |