VAT Opdracht

johnny vos
Berichten: 8
Lid geworden op: 29-08-2013 15:18

VAT Opdracht

Bericht door johnny vos » 27-09-2013 14:28

In de VAT opdracht staat de volgende tekst:

Hoe wordt KL-HoofdFrame in een van de subFrames bekend? Meegeven aan de constructor! Bijvoorbeeld:

Code: Selecteer alles

public KL_BlokFrame(String title, VAT oapp)

Weet iemand wat hiermee bedoeld wordt?

marcel
Berichten: 13
Lid geworden op: 29-08-2013 17:59

Bericht door marcel » 27-09-2013 17:27

Het staat er allemaal inderdaad een beetje onduidelijk omschreven, maar ik denk dat hier had moeten staan zoiets als:

Code: Selecteer alles


public KL_BlokFrame(String title, KL_HoofdFrame hoofdFrame)

Op deze manier kun je een referentie naar het hoofdframe doorgeven aan je subframe(s), zodat je subframes eigenschappen en methodes van het hoodframe kunnen aanroepen.

johnny vos
Berichten: 8
Lid geworden op: 29-08-2013 15:18

Bericht door johnny vos » 28-09-2013 10:01

Bedankt Marcel.
En gelijk weer een andere vraag :)
Zit nogal te peinzen over hoe ik de ingevoerde gegevens doorstuur naar de arraylist die ik gemaakt heb in de klasse vormcollectie.

Hieronder de Ok button action waar het opgevangen wordt:

Code: Selecteer alles

    private void OkButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
       //Haal de waardes op die ingevoerd zijn.
        
        Double BlockLengteField = Double.parseDouble(LengteField.getText());
        Double BlockBreedteField = Double.parseDouble(BreedteField.getText());
        Double BlockHoogteField = Double.parseDouble(HoogteField.getText()); 
        
        //Verstop het blockframe
        hide();
    }  
Deze dient dan doorgestuurd te worden naar de arraylist:

Code: Selecteer alles


public class ShapeCollection 
{
    private ArrayList<Double> shapes;
    
    
    public ShapeCollection()
    {
        shapes = new ArrayList<Double>();
    }
    
    
    
}
en daarna in de list van de mainframe komt. Maar heb ff geen idee hoe ik dat doe....

marcel
Berichten: 13
Lid geworden op: 29-08-2013 17:59

Bericht door marcel » 28-09-2013 13:43

Johnny,

Om je op weg te helpen:

Ik denk ik dat je de volgende stappen dient uit te voeren:
private void OkButtonActionPerformed(java.awt.event.ActionEvent evt) {
//Haal de waardes op die ingevoerd zijn.

Double BlockLengteField = Double.parseDouble(LengteField.getText());
Double BlockBreedteField = Double.parseDouble(BreedteField.getText());
Double BlockHoogteField = Double.parseDouble(HoogteField.getText());

//Verstop het blockframe
hide();
}
1. Maak een Vorm object aan op basis van de uitgelezen waarden in de code hierboven. Ongeveer zoiets:

Code: Selecteer alles

Vorm nieuw = new Vorm(BlockLengteField, BlockBreedteField, BlockHoogteField);
2. Voeg aan de shape collectie een methode toe waarmee je vormen aan de collectie kunt toevoegen:

Code: Selecteer alles

public void voegVormToe(Vorm vorm){
      shapes.add(vorm);
}
3. Loop door je vormen collectie en voeg iedere vorm toe aan de lijst welke je wilt tonen in je hoofdscherm.

wesleyv
Berichten: 10
Lid geworden op: 29-08-2013 16:41

Bericht door wesleyv » 29-09-2013 19:38

Hoi Allemaal. Ik heb ook nog een uitdaging in mijn versie van de VAT opdracht.

Ik kwam pas bij deze "uitdaging" toen ik met de datalaag aan de slag ging. Ik heb dit nu volledig werkend, maar ik vind het net erg netjes en spreekt tegen met wat er in het boek wordt geleerd (onderhouds vriendelijke code). Toch kom ik er niet precies uit hoe ik de code wel onderhouds vriendelijk neer kan zetten.

Ik zal mijn probleem met wat stukjes code toelichten:
- Ik maak gebruik van een ShapeController class welke communiceert met de datalaag.
- Mijn Sphere, Cube en Cylinder entiteitsclasses zijn opgebouwd met overerving van Shape
- In de datalaag heb ik DAO's aangemaakt per type (CubeDAO, CylinderDAO etc..)
- Ik heb 1 arraylist die Shapes bevat. Dit kunnen dus zowel Cubes als Cylinders als Spheres zijn.

In mijn controller classe loop ik al direct tegen een probleem aan met dat ik 1 methode heb addShape. Om deze generiek te houden heeft deze een Shape als parameter. Echter wil ik dit in de Database doorvoeren zou ik met instanceof moeten gaan casten:

Code: Selecteer alles

    
public void addShape(Shape shape)
    {
        if (shape instanceof Cube) {
            CubeDAO.save((Cube) shape);
        } else if (shape instanceof Sphere) {
            SphereDAO.save((Sphere) shape);
        } else if (shape instanceof Cylinder) {
            CylinderDAO.save((Cylinder) shape);
        }
    }
Probleem is, als ik nu een nieuwe vorm erbij wil, moet ik dit ook in dit stuk code toevoegen wat erg fout gevoelig ligt. Hetzelfde probleem heb ik bij het verwijderen van een Shape. Iemand een idee hoe dit beter af te vangen valt? Gezien het technisch niet mag om vanuit Entity naar de DataStorage laag te gaan, kan ik de save en remove methodes ook niet daar onderbrengen.

marcel
Berichten: 13
Lid geworden op: 29-08-2013 17:59

Bericht door marcel » 29-09-2013 19:56

Wesley,

Misschien moet je het op een ander niveau generiek maken. Ik heb zelf bijvoorbeeld een ShapeCollection klasse welke allerlei typen vormen kan bevatten, welke zijn afgeleid van de basis (super) klasse Shape.

Mijn datalaag slaat de gehele collectie op in de database ipv elk object in de collectie.

Groet,
Marcel

wesleyv
Berichten: 10
Lid geworden op: 29-08-2013 16:41

Bericht door wesleyv » 29-09-2013 20:12

Hey Marcel,

Ik heb ook een ShapeCollection welke allerlei typen kan bevatten welke zijn afgeleid van de super klasse Shape. Alleen ik sla inderdaad per object op ipv de hele collecte in 1 keer. Ik lees op internet nu wel veel over een GenericDAO aan te maken, maar dit gaat mijn pet nog wat te boven..

Ik denk dat (gezien de tijd) ik het nu nog maar even zo laat. Mogelijk kan dit donderdag in de les nog besproken worden :)).

RonaldK
Berichten: 10
Lid geworden op: 29-08-2013 16:40

Bericht door RonaldK » 30-09-2013 18:00

Wesley,

Ik loop tegen exact hetzelfde probleem aan, en het generiek maken van vormen is inderdaad geen simpele klus ben ik achter gekomen.

In principe is er niets mis met het opslaan van elk object in de database in plaats van de hele collectie. Dit geeft je meer flexibliteit, als je bijvoorbeeld de database met vormen vanuit een andere applicatie wilt benaderen.

Christiank
Berichten: 3
Lid geworden op: 05-09-2013 16:56

Bericht door Christiank » 01-10-2013 21:04

In de vat opdracht staat dat de data naar bestand en naar tekst bestand geschreven moet kunnen worden.
Ik begrijp niet helemaal wat er met "tekst bestand" bedoeld wordt.
Moet het serializable object dan naar een tekst bestand geschreven worden? dus een *.txt file ?
Of moeten de waarde van deze objecten komma gescheiden in een tekst bestand geschreven worden?

johnny vos
Berichten: 8
Lid geworden op: 29-08-2013 15:18

Bericht door johnny vos » 01-10-2013 21:29

Ben inmiddels zo ver dat ik de vormen nu wil weergeven in een tabel in de GUI. Alleen krijg dit niet voor elkaar.

In mijn mainframe zit het volgende om een tablemodel aan te maken.

Code: Selecteer alles

     public Object[][] createShapesTableModel() {
        Iterator<Shape> shapeIterator = shapecontroller.ShapeIterator();
        Object[][] tableModel = new Object[shapecontroller.nrShapes()+1][2];
        int i = 0;
        while(shapeIterator.hasNext()) {
            Shape shape = shapeIterator.next();
            tableModel[i][0] = shape.getSoort();
            tableModel[i][1] = shape.getSoort();
            i++;
        }
        
        return tableModel;
    }
Nu heb ik direct daaronder
(Dus ook in de mainframe, weet ook niet of dat in de mainframe hoort, of in elk van de eigen GUI's voor elke vorm)

een combox action performed die dit zou moeten uitvoeren

Code: Selecteer alles


    private void ComboBoxSelectVormActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        TableModel tableModel = new javax.swing.table.DefaultTableModel(
            createShapesTableModel(),
            new String [] {"Vorm", "Cijfer"});
        ShapesOverview.setModel(tableModel);
              
    }  
Wat die wel doet is gelijk de nieuwe string maken, dit zie ik omdat de tabel veranderd.

Code: Selecteer alles

            new String [] {"Vorm", "Cijfer"});
Maar er komt geen naam daaronder te staan.

De naam wordt gedefineerd in de klasse Shape:

Code: Selecteer alles

    

public class Shape {
    
    private String soort;
       
    public Shape()
    {
        
    }
    
    public String getSoort()
    {
        return soort;
    }
    
}
Deze soort wordt in een overgeërfde methode overschreven bijv in Block:

Code: Selecteer alles


public class Block extends Shape
{

    private String soort;
   
    public Block()
    {
        super();
        soort = "Blok";
    }
    
   
    public String getSoort()
    {
        return soort;
    }
    
}
Sorry voor het lange bericht, maar hopelijk kan iemand me helpen.




Na wat testen kwam ik erachter dat het WEL werkt. Maar dit gebeurt pas als ik voor de 2e keer iets selecteer, dan komt de 1e geselecteerde vorm pas in de tabel. Iemand een idee?

Plaats reactie