Toon posts:

[JAVA] Probleem met uitlezen uit Vector

Pagina: 1 2 Laatste
Acties:
  • 1.128 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Met een groepje van 3 personen (waren er 5) zijn we bezig met het ontwikkelen van een bank applicatie, maar we hebben nog veel problemen. Een van de problemen is dat we op dit moment niet de namen uit de vector van de klanten kunnen krijgen.

Ik zal even in het kort uitleggen hoe de programma eruit ziet.
- gui (map met de gui's)
- dt (map met een filewriter bestand)
- klassen (de klassen en controllers)

De klasse Bank heeft een overzicht van de rekeningen, klanten en medewerkers. De operaties van een klant toevoegen enzo staat daarin vermeld. Ook hebben we de operatie van klant toevoegen om op te slaan via de filewriter bestand en een klant te laden:

code:
1
2
3
4
5
6
7
8
9
    public void load() {
        klanten = BankSysteem.loadKlanten();
        medewerkers = BankSysteem.loadMedewerkers();
    }

    public void save() {
        BankSysteem.saveKlanten(klanten);
        BankSysteem.saveMedewerkers(medewerkers);
    }


BankSysteem.java is de filewriter bestand in de dt map.

Om het een beetje uit te testen wilden we eerst gaan werken met de KlantBeheerGui en die ziet er op dit moment zo uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package gui;

import klassen.KlantGuiController;
import klassen.Bank;
import klassen.Klant;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class KlantBeheerGui extends JFrame implements ActionListener{
       private JPanel p1,p2,p3;
       private JButton b1, b2, b3, b4;
       private JComboBox box1;
       private Bank bank;
       private Vector<Klant> klanten;

    public KlantBeheerGui () {
        setTitle("Klant");
        setResizable(false);
        setBounds(250, 250, 375, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        p1 = new JPanel();
        p1.setLayout(new GridLayout(2,2));
        b1 = new JButton("Gegevens");
        b1.addActionListener(this);
        p1.add(b1);

        b2 = new JButton("Rekening(en)");
        b2.addActionListener(this);
        p1.add(b2);

        b3 = new JButton("Klant Toevoegen");
        b3.addActionListener(this);
        p1.add(b3);

        b4 = new JButton("Annuleren");
        b4.addActionListener(this);
        p1.add(b4);

        p2 = new JPanel();
        p2.setLayout(new GridLayout(2,2));
        box1 = new JComboBox();
        p2.add(box1);
        //for (int i=0; i<bank.getKlanten();i++){
            box1.addItem(klant.getNaam());
        //}

        box1.setEditable(false);

        p3 = new JPanel();
        p3.setLayout(new BorderLayout());
        p3.add(p1, BorderLayout.SOUTH);
        p3.add(p2, BorderLayout.NORTH);

        getContentPane().add(p3);

        pack();

    }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == b1){
            dispose();

        }
        if(e.getSource() == b2){
            dispose();

        }
        if(e.getSource() == b3){
            dispose();
            new KlantToevoegenGui();
        }
        if(e.getSource() == b4){
            dispose();
            new MedewerkerMenuGui();
        }
    }

    public static void main (String[] parameters) {
        new KlantBeheerGui ();
    }
}


De bedoel is dat de klantnamen worden getoond hier
code:
1
2
3
        //for (int i=0; i<bank.getKlanten();i++){
            box1.addItem(klant.getNaam());
        //}


Maar we krijgen alsmaar een foutmelding van:
.\gui\KlantBeheerGui.java:47: cannot find symbol
symbol : variable klant
location: class gui.KlantBeheerGui
box1.addItem(klant.getNaam());

We hebben geprobeerd om het via andere klassen te doen, maar we komen er niet echt uit.

Overigens wist ik niet zo goed wat ik precies moest posten van mijn java code om het duidelijk uit te leggen. Als jullie meer codes willen om het probleem verder te bekijken dan post ik ook de rest van de codes waar jullie in willen kijken.

Thnx.

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
lees nou eens de melding.. de variabele klant is nergens gedefinieerd.. waar komt ie vandaan?

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Verwijderd

Topicstarter
Je hebt gelijk, dat was ook een fout, maar ik had dat ook nog veranderd in klanten.getNaam() en dat gaf ook een foutmelding.

.\gui\KlantBeheerGui.java:47: cannot find symbol
symbol : method getNaam()
location: class java.util.Vector<klassen.Klant>
box1.addItem(klanten.getNaam());

Nu heeft die het over dat die de symbol getNaam() niet kan vinden, maar die staat in de klasse Klant:
code:
1
2
3
4
public String getNaam()
    {
        return naam;
    }

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Maar klanten is geen klant neem ik aan. Ik vermoed dat klanten een Vector is. Je zult dan eerst de klant uit de vector moeten halen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

klanten heb je gedeclareerd als een Vector<Klant> en in die klasse is de methode getName() onbestaande. Je moet eerst een klant uit de vector klanten halen (zie hier) en dan pas kan je op de klant die je terugkrijgt de methode getNaam() uitvoeren.

  • momania
  • Registratie: Mei 2000
  • Laatst online: 05:21

momania

iPhone 30! Bam!

Als je dan toch generics gebruikt, doe het dan wel goed:

Java:
1
2
3
for (Klant klant : bank.getKlanten()) {
  // doe iets met de 'klant'
}


Maar goed, met ouderwest for loopje moet je dus wel zelf even steeds een object uit je collectie halen, dat gaat niet vanzelf. ;)

Neem je whisky mee, is het te weinig... *zucht*


  • wlunchi
  • Registratie: Februari 2003
  • Laatst online: 15-11 11:16
Verwijderd schreef op vrijdag 13 april 2007 @ 12:42:

location: class java.util.Vector<klassen.Klant>
box1.addItem(klanten.getNaam());

Nu heeft die het over dat die de symbol getNaam() niet kan vinden, maar die staat in de klasse Klant:
code:
1
2
3
4
public String getNaam()
    {
        return naam;
    }
Wat Janoz zei:
je moet zoiets doen:
klanten.get(index).getNaam() // klanten is een Vector van Klant. met get(index) haal je klant met index == index. en van klant object doe je getNaam().

  • akaIDIOT
  • Registratie: Januari 2005
  • Laatst online: 03-10 23:33
momania schreef op vrijdag 13 april 2007 @ 13:01:
Als je dan toch generics gebruikt, doe het dan wel goed:

Java:
1
2
3
for (Klant klant : bank.getKlanten()) {
  // doe iets met de 'klant'
}
Pas op met de foreach-loop en collections in Java... Als je iets met je collectie gaat doen in deze loop gaat het stuk met een ConcurrentModificationException (ook als je niet aan het multithreaden bent). Als je alleen met je var (klant in dit geval) gaat lopen morren gaat het prima.

*stu!ter* *boink*


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 08:22
Als je dan toch met het collections framework aan de gang bent, waarom heb je dan nog voor een Vector gekozen?

[ Voor 17% gewijzigd door Kwistnix op 13-04-2007 19:03 ]


  • momania
  • Registratie: Mei 2000
  • Laatst online: 05:21

momania

iPhone 30! Bam!

akaIDIOT schreef op vrijdag 13 april 2007 @ 18:01:
[...]


Pas op met de foreach-loop en collections in Java... Als je iets met je collectie gaat doen in deze loop gaat het stuk met een ConcurrentModificationException (ook als je niet aan het multithreaden bent). Als je alleen met je var (klant in dit geval) gaat lopen morren gaat het prima.
I know ;)
FallenAngel666 schreef op vrijdag 13 april 2007 @ 19:02:
Als je dan toch met het collections framework aan de gang bent, waarom heb je dan nog voor een Vector gekozen?
Want? Je weet dat Vector ook gewoon onderdeel van het collections framework is en dat het een mythe is dat hij trager zou zijn omdat hij synchronized is? ;)

Hij wordt alleen trager als dat synchronized echt gebruikt wordt, maar bij de manier waarop de TS 'm gebruikt zal de compiler die synchronized aanroep weg-optimaliseren ;)

Neem je whisky mee, is het te weinig... *zucht*


  • Beerkeeper
  • Registratie: April 2003
  • Laatst online: 01-12 20:27
Ik weet zeker dat dit een huiswerk opdracht is! Hogeschool Utrecht eerstejaars? ;)

Sowieso mag de GUI geen Controllerdingen doen (a.k.a. ActionListener e.d.)

[ Voor 32% gewijzigd door Beerkeeper op 13-04-2007 20:28 ]

XBO Gamertag: BeerkeeperNL


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 08:22
momania schreef op vrijdag 13 april 2007 @ 20:21:
Want? Je weet dat Vector ook gewoon onderdeel van het collections framework is en dat het een mythe is dat hij trager zou zijn omdat hij synchronized is? ;)

Hij wordt alleen trager als dat synchronized echt gebruikt wordt, maar bij de manier waarop de TS 'm gebruikt zal de compiler die synchronized aanroep weg-optimaliseren ;)
Het is zeker een onderdeel van het collections framework en dat de 'recente' Java versies allerlei synchronisatie optimialisaties toegepast worden weet ik, maar het blijft een legacy klasse.
In 1.2 hebben ze Vector een geforceerd onderdeel gemaakt van het nieuwe Collections Framework door Vector de List interface te laten implementeren Naar mijn mening heeft Vector in de huidige versie van Java geen echt bestaansrecht meer en ik vraag mij af waarom de TS er voor heeft gekozen, als het al een bewuste keuze was.

  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
momania schreef op vrijdag 13 april 2007 @ 20:21:
[...]
Want? Je weet dat Vector ook gewoon onderdeel van het collections framework is en dat het een mythe is dat hij trager zou zijn omdat hij synchronized is? ;)
Is dat zo? Ik vraag me af of het pas geldt als er echt contention is voor een lock op het object. Om te kunnen zien of er contention is (of die er momenteel nu is of niet), zul je toch -iets- moeten checken. Dat betekent naar main-memory gaan, daar een check (read) EN een write doen (om aan te geven dat jij nu de lock hebt, ook al is er nooit iemand anders die hem wil). Misschien dat er dan nog wat leuke cache-coherence delays optreden als 1 van de andere CPUs in je systeem dat gebied net gecached hadden.

Anyway, misschien worden de kosten van synchronisation wel overgeschat op moderne VMs, maar als je op simpele manier dingen kunt besparen, waarom niet? Zeg nou zelf, je tikt net zo makkelijk ArrayList in als Vector. Is voor de programmeur geen enkele moeite ;)

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • momania
  • Registratie: Mei 2000
  • Laatst online: 05:21

momania

iPhone 30! Bam!

flowerp schreef op zaterdag 14 april 2007 @ 11:08:
[...]


Is dat zo? Ik vraag me af of het pas geldt als er echt contention is voor een lock op het object. Om te kunnen zien of er contention is (of die er momenteel nu is of niet), zul je toch -iets- moeten checken. Dat betekent naar main-memory gaan, daar een check (read) EN een write doen (om aan te geven dat jij nu de lock hebt, ook al is er nooit iemand anders die hem wil). Misschien dat er dan nog wat leuke cache-coherence delays optreden als 1 van de andere CPUs in je systeem dat gebied net gecached hadden.
Het Java Memory Model is een wonderlijk iets :P
Lees maar eens wat van Brian Goetz bv. Je zal verbaasd zijn over wat de JVM allemaal voor je optimaliseerd. (Al moet ik wel zeggen dat de meeste van de ze optimalisaties alleen op de server JVM plaatsvinden... )
Anyway, misschien worden de kosten van synchronisation wel overgeschat op moderne VMs, maar als je op simpele manier dingen kunt besparen, waarom niet? Zeg nou zelf, je tikt net zo makkelijk ArrayList in als Vector. Is voor de programmeur geen enkele moeite ;)
true :)

Neem je whisky mee, is het te weinig... *zucht*


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
momania schreef op zaterdag 14 april 2007 @ 11:56:
[...]
Lees maar eens wat van Brian Goetz bv. Je zal verbaasd zijn over wat de JVM allemaal voor je optimaliseerd.
Of misschien juist verbaasd over wat ie nog steeds niet zelf optimaliseert ;) Je zou bijvoorbeeld kunnen bedenken dat een JVM @runtime weet dat een bepaald stukje code maar door 1 thread kan worden opgeroepen (bv omdat er simpelweg maar 1 thread in het huidige programma is), en daardoor alle synchronisations simpelweg weglaat. 'Iets' complexer wordt het wanneer de JVM @runtime moet bewijzen dat bij de aanwezigheid van meerdere threads, maar 1 thread bij een bepaald stukje code kan komen.

Geen idee of de huidige JVM dergelijke optimalisaties kan doen.

Het feit dat de JVM, maar ook (C++, Pascal, etc) compilers, en CPU's hoog complexe optimalisaties kunnen doorvoeren, betekent dat vele micro optimalisaties die in het hoofd van een programmeur zouden kunnen leven inderdaad vaak totale onzin zijn.

Triviaal voorbeeld is iets als het volgende:

Java:
1
2
3
4
5
6
if ( something) {
   return 0;
}
else {
   return 1;
}


vs

Java:
1
2
3
4
5
if ( something) {
   return 0;
}

return 1;


Er zouden naïeve programmeurs kunnen zijn die denken dat de laatste sneller is, omdat het een 'instructie' scheelt. |:(

Deze case zie je natuurlijk snel, maar de effecten van hoog complexe optimalisaties zijn zeker niet altijd van te voren in te schatten, zelfs niet door de meest ervaren programmeurs!

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • momania
  • Registratie: Mei 2000
  • Laatst online: 05:21

momania

iPhone 30! Bam!

flowerp schreef op zaterdag 14 april 2007 @ 12:33:
[...]


Of misschien juist verbaasd over wat ie nog steeds niet zelf optimaliseert ;) Je zou bijvoorbeeld kunnen bedenken dat een JVM @runtime weet dat een bepaald stukje code maar door 1 thread kan worden opgeroepen (bv omdat er simpelweg maar 1 thread in het huidige programma is), en daardoor alle synchronisations simpelweg weglaat. 'Iets' complexer wordt het wanneer de JVM @runtime moet bewijzen dat bij de aanwezigheid van meerdere threads, maar 1 thread bij een bepaald stukje code kan komen.

Geen idee of de huidige JVM dergelijke optimalisaties kan doen.
Voor zover ik me kan herinneren kan de jvm deze optimalisaties doen :)
Triviaal voorbeeld is iets als het volgende:
Ik vind deze wel leuk:
Java:
1
2
3
4
5
6
7
8
9
10
11
public String getSomethingFromUglyCode() {
  Vector<String> v = new Vector<String>();
  v.add("Henk");
  v.add("Klaas");
  v.add("Kees");
  String result = null;
  for(String s : v) {
    result += s;
  }
  return result;
}


Dit wordt uiteindelijk gewoon:
Java:
1
2
3
public String getSomethingFromUglyCode() {
  return "HenkKlaasKees";
}




Weet niet of je er bekend mee bent, maar 'escape analysis' (mocht je het niet kennen) moet je maar eens opzoeken en wat over lezen :)

[ Voor 5% gewijzigd door momania op 14-04-2007 12:50 ]

Neem je whisky mee, is het te weinig... *zucht*


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
momania schreef op zaterdag 14 april 2007 @ 12:44:
[...]
Dit wordt uiteindelijk gewoon:
Java:
1
2
3
public String getSomethingFromUglyCode() {
  return "HenkKlaasKees";
}
Dat is wel een erge high-level optimalisatie zeg. Zo op het eerste oog lijkt het triviaal, maar dat is het zeker niet. De JVM moet dan -exact- weten wat een Vector.add precies doet, en wat een AbstractList.Iterator().next() precies terug geeft en intern potentieel kan doen.

Misschien dat ik wel mijn eigen AbstractList heb geschreven (de JVM staat namelijk los van de JDK class lib), waarbij de next() functie intern naar de clock kijkt en op Pasen de String 'Pasen' terug geeft.

Voor een programmeur natuurlijk een onzin functie, maar de JVM zal dus alle code van alle betrokken classen moeten nalopen. Ze mag er zeker niet van uitgaan dat Vector.add een vaststaande operatie is.
Weet niet of je er bekend mee bent, maar 'escape analysis' (mocht je het niet kennen) moet je maar eens opzoeken en wat over lezen :)
:) :
Gepost door flowerp - zondag 12 februari 2006 17:28 Score: 4 (Informatief)

In Mustang wordt het al genoemde escape analysis geintroduceerd. Hiermee analyseert de compiler en/of VM of een object uit een scope kan 'ontsnappen' of niet. Zo niet dan kan, indien het een hotspot wordt, gekozen worden voor een stack allocatie. Dit kan dus een heel groot performance voordeel geven. Het maakt het er voor de programmeur ook makkelijker op. Nu moet je vaak in C++ gaan nadenken of je heap of stack wilt. Veel programmeurs doen maar wat, zodat het potentiele voordeel niet benut wordt. De JVM kan deze keuze dus zelf maken, zodat ook code van 'mindere' programmeurs versneld kan worden.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • flowerp
  • Registratie: September 2003
  • Laatst online: 11-09 18:20
Grappig is trouwens dat soms optimalisaties waarvan je zou denken dat het geen enkele serieuze nut zou kunnen hebben, juist zeer grote gevolgen kunnen hebben. Lees deze report maar eens:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103956

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


Verwijderd

Topicstarter
Bedankt voor de reacties allemaal!

Ik heb eens zitten werken maar ik krijg alsmaar een nullpointerexception terwijl er toch echt wat is geschreven in de bestand die de data bevat.

code:
1
2
3
//for (int i=0; i<bank.getKlanten();i++){
            box1.addItem(klant.getNaam());
        //}


heb ik gewijzigd in:
code:
1
2
3
4
5
6
7
8
9
        Klant klant = (Klant)klanten.elementAt(0);
        if (bank.getKlanten() == null){
            box1.addItem("Geen Klanten");
        }
        else{
            for (int i=0; i<bank.klantTeller();i++){
                            box1.addItem(klant.getNaam());
            }
        }

  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

Heb je wel eens uitgezocht wat een NullPointerException precies is?
Wat je nu doet is iets aanroepen op de variabele 'klanten' die naar null verwijst, hence de npe.
Momania wijst je eerder in het topic al op de java 5 for-loop, je code zou dan zoiets moeten worden:
Java:
1
2
3
4
5
6
7
8
Vector<Klant> klanten = bank.getKlanten();
if (klanten == null || klanten.isEmpty()) {
  box1.addItem("Geen klanten");
} else {
  for (Klant klant : klanten) {
    box1.addItem(klant.getNaam());
  }
}

Ik check hier de variabele klanten op null en empty, imo is dat niet zo netjes. Je kunt beter je api zo designen dat je altijd maar een van de twee checks nodig hebt om te controleren of je 1 of meer elementen terug krijgt. Dus als er geen klanten zijn geen null teruggeven, maar een lege lijst. De lege lijst krijg je door bijv. Collections.emptyList() aan te roepen. Dat is wat sneller dan een nieuwe lijst maken, je moet dan wel met de interface List werken ipv met Vector.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Verwijderd

Topicstarter
NetForce1 schreef op maandag 16 april 2007 @ 10:25:
Heb je wel eens uitgezocht wat een NullPointerException precies is?
Wat je nu doet is iets aanroepen op de variabele 'klanten' die naar null verwijst, hence de npe.
Momania wijst je eerder in het topic al op de java 5 for-loop, je code zou dan zoiets moeten worden:
Java:
1
2
3
4
5
6
7
8
Vector<Klant> klanten = bank.getKlanten();
if (klanten == null || klanten.isEmpty()) {
  box1.addItem("Geen klanten");
} else {
  for (Klant klant : klanten) {
    box1.addItem(klant.getNaam());
  }
}

Ik check hier de variabele klanten op null en empty, imo is dat niet zo netjes. Je kunt beter je api zo designen dat je altijd maar een van de twee checks nodig hebt om te controleren of je 1 of meer elementen terug krijgt. Dus als er geen klanten zijn geen null teruggeven, maar een lege lijst. De lege lijst krijg je door bijv. Collections.emptyList() aan te roepen. Dat is wat sneller dan een nieuwe lijst maken, je moet dan wel met de interface List werken ipv met Vector.
I see.. thnx :)

Over de code die jij mij nu hebt gegeven: ik krijg nog steeds dezelfde foutmelding.

Ik heb nooit echt precies uitgezocht wat het betekende de NullPointerException, maar ik dacht dat dat betekende dat de vector niks kan ophalen (geen data bevat, terwijl die dat wel heeft) en daarom een foutmelding geeft.

Verwijderd

Topicstarter
Misschien is het handig om ook de Main klasse te posten
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import gui.*;

import java.io.*;
import java.util.HashMap;
import java.util.Vector;
import dt.BankSysteem;
import klassen.Bank;
import klassen.Klant;
import klassen.Rekening;
import klassen.Medewerker;


public class Main
{


    public static void main(String[] args) throws IOException
    {

        // Dit is onze bank:
        new Bank("De HogeschoolBank");

        // hier worden 4 rekeningen (en bijbehorende klanten) aangemaakt:

        Bank.bank.addMedewerker(new Medewerker(1, "", "B. Medewerker", "Nijenoord 1", "Utrecht"));

        Bank.bank.addKlant(new Klant(1, "Piet", "Dorpsweg 1", "Goes", ""));
        Bank.bank.addKlant(new Klant(2, "Jan", "Hoofdstraat 4", "Markelo", ""));
        Bank.bank.addKlant(new Klant(5, "Jan", "Hoofdstraat 4", "Markelo", ""));
        Bank.bank.addKlant(new Klant(6, "Jan", "Hoofdstraat 4", "Markelo", ""));


        // Laat de gebruiker inloggen en een menukeuze maken
        System.out.println("Dit is de applicatie van DeBank");

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);

        System.out.println("Dit was de applicatie van DeBank");
    new KlantBeheerGui();

    }
}

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Een nullpointerexception wordt geworpen wanneer je wat probeert te doen met iets wat niet bestaat. Sowieso wordt bij die nullpointer exception ook een regelnummer gegeven waardoor je heel makkelijk kunt zien waar het probleem zit.

Als ik zo naar je code kijk dan lijkt het me dat je eens zou moeten gaan kijken naar variabelen. Die gebruik je namelijk helemaal niet. Je nullpointer wordt waarschijnlijk veroorzaakt doordat bank in je KlantBeheerGui helemaal geen waarde heeft.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
De nullpointerexception geeft regel 47 aan en dat is de eerste regel van de code waar ik de hele tijd mee zit :p

Op dit moment dit dus:
Java:
1
2
3
4
5
6
7
8
Vector<Klant> klanten = bank.getKlanten(); 
if (klanten == null || klanten.isEmpty()) { 
  box1.addItem("Geen klanten"); 
} else { 
  for (Klant klant : klanten) { 
    box1.addItem(klant.getNaam()); 
  } 
}

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Je post 8 regels, dat is meer dan die ene regel waar de nullpointer exception naar wijst. Naar welke regel wijst die nullpointer. Bedenk dat een object wel een waarde moet hebben wanneer je er een methode op aanroept.

Waarom trouwens die enorm brakke manier in je mainclass waarbij je static de bank benaderd? Waarom niet gewoon een variabele?

[ Voor 23% gewijzigd door Janoz op 16-04-2007 11:05 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Sorry, eerste regel van de code dus dit:
Java:
1
Vector<Klant> klanten = bank.getKlanten();  


En over de manier waarbij we de bank benaderen kan ik weinig zeggen, we zijn nog niet zo lang bezig met JAVA en we hebben gewoon ongeveer gedaan wat we tot nu toe geleerd hebben van de docenten.

  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

De variabele bank is dus null, waar komt die vandaan?

[ Voor 24% gewijzigd door NetForce1 op 16-04-2007 11:18 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Marcj
  • Registratie: November 2000
  • Laatst online: 01-12 16:59
Een NullPointerException op die regel kan alleen zijn dat bank null is. Dus heb je bank wel aangemaakt en geinitialiseerd?

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 03:20
Als je denkt dat de variabele 'bank' die je in je main functie hebt aangemaakt, daarmee aanroept, dan heb je het mis.
Het zijn aparte objecten.
Een object in een ene klasse, is niet hetzelfde als in een andere klasse en hebben dus ook niet automatisch dezelfde waarde. Dit moet je explicitiet toevoegen, bv. door het mee te geven als variabele in je constructor.

b.v.
code:
1
2
3
4
public BankGui(Bank b){
  this.bank = b;
  // andere code die in je public BankGUI() staat.
}

let the past be the past.


Verwijderd

Topicstarter
Ik neem aan dat er met de bank over de bank klasse wordt gesproken? En ja die is aangemaakt en gecompileerd.

Ik kom er niet echt uit, ik zal even de benodigde code hiervoor uploadeden:
http://www.wikiupload.com/download_page.php?id=127476

Is niet echt netjes zo om de allemaal code te dumpen, maar ik hoop dat iemand mij kan helpen hiermee.

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Woojikooji: als je niet bekend bent met de termen en nullpointers, dan is het handiger om eerst eens wat tutorials te doornemen. Een "bank variabele" is absoluut niet hetzelfde als een "bank klasse" ;)

Verwijderd

Topicstarter
Thnx, ik snap wel wat er met de bank variabele wordt bedoel, namelijk private Bank bank :p maar niet echt met de vragen of die is aangemaakt en geinitialiseerd :D want ik dacht dat die al is aangemaakt, in de desbtreffende code?

[ Voor 23% gewijzigd door Verwijderd op 16-04-2007 11:48 ]


  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

Initialiseren is een waarde toekennnen aan die variabele, bijv. Bank bank = new Bank(); Of wat Spee zegt. Maar een tutorial doornemen kan zeker geen kwaad ;)

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Verwijderd schreef op maandag 16 april 2007 @ 11:46:
maar niet echt met de vragen of die is aangemaakt en geinitialiseerd :D want ik dacht dat die al is aangemaakt, in de desbtreffende code?
Klik eens op het linkje dat ik jou heb gegeven en volg de linkjes daarin :)

Verwijderd

Topicstarter
Hehe ik heb maar eens ff 5 minuten de tijd genomen om duidelijk door te nemen wat er precies moet gebeuren mbv die links.

Met het toevoegen van
Java:
1
Bank bank = new Bank("De Hogeschoolbank");


komt er geen foutmelding.

Ik ben nu alweer een stap verder maar nu komt er te staan dat er geen klanten zijn :p En dat terwijl er al klanten zijn :p

En is het niet mogelijk om Bank bank = new Bank("De Hogeschoolbank"); gewoon in main te schrijven zoals die dat nu al is en dit in de andere klassen te laden, want als we de naam ervan veranderen moet die overal worden veranderd.

  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

Jazeker, dan moet je de variable bank aan je gui doorgeven, dit kan bijv. via de constructor zoals hier aangegeven: SPee in "[JAVA] Probleem met uitlezen uit Vector"

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Verwijderd

Topicstarter
Ok bedankt, nu maar uitzoeken waarom die de data uit de bestand niet haalt, en ik moet ook nog een manier bedenken om de data in de bestand te kunnen bewerken en toevoegen :/ Gaan nog 3 lange dagen worden denk ik.. (donderdag namelijk een presentatie hiervan :o )

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Als jij dat stukje code in je gui hebt staan (Bank bank - new Bank("blaat");) dan is het natuurlijk logisch dat deze leeg is. Je hebt op dat moment namelijk 2 banken. De ene bank zit in je hoofdklasse (de variabele bank daar) en de andere bank zit in je gui klasse. Je hebt immers 2x een nieuwe bank gemaakt. Wil je dat dat dezelfde bank is dan zul je op 1 of andere manier de bank uit je hoofdklasse door moeten geven aan de guiklasse. Dit kun je doen op de manier die SPee aangeeft.

Verder ben ik het volledig met BalusC eens. Je mist enkele zeer belangrijke basisbeginselen. Op deze manier aanmodderen levert je alleen maar meer problemen op. Probeer eerst eens onder de knie te krijgen wat een variabele is, wat een object is en wat een class is, en dan vooral ook wat het verschil hiertussen is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

Misschien is serializen wel handig dan, of is dat niet toegestaan?

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Voor iemand die op dit moment bezig is het verschil tussen een class en een object uit te vogelen lijkt me het serializen nog redelijke rocketsience. Het lijkt me dan ook niet handig om daar gelijk al over te beginnen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Bedankt voor alle hulp tot zover, zodra we deze project afhebben, ga ik alles goed opnieuw doornemen. Ik heb het meer door elkaar heen allemaal geleerd wat helemaal niet goed is geweest blijkt maar weer eens.

Ik heb net met de docent naar mijn code gekeken en ik ben eruit gekomen en wat jullie zeiden was helemaal waar maar ik wist niet echt precies hoe ik dat moest verhelpen dus hebben we er even naar gekeken en we kwamen eruit.

Bank wordt in de klasse bank aangemaakt en opgehaald in de andere klassen (Main en KlantBeheerGui oa) mbv
Java:
1
Bank bank = Bank.getInstance();

  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

Janoz schreef op maandag 16 april 2007 @ 13:13:
Voor iemand die op dit moment bezig is het verschil tussen een class en een object uit te vogelen lijkt me het serializen nog redelijke rocketsience. Het lijkt me dan ook niet handig om daar gelijk al over te beginnen.
Dat is misschien wel waar, maar het moet sowieso weggeschreven worden volgens de opdracht, en dat is misschien nog wel moeilijker. Dit is gewoon een kwestie van bijna letterlijk de codevoorbeeltjes volgen. Maar zelf wegschrijven is in deze fase wel veel leerzamer natuurlijk.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

momania schreef op vrijdag 13 april 2007 @ 20:21:
Want? Je weet dat Vector ook gewoon onderdeel van het collections framework [..]
Het is wel een vreemde eend in de bijt, waarvan het niet vreemd zou zijn als'ie ooit nog deprecated wordt.

Wie trösten wir uns, die Mörder aller Mörder?


Verwijderd

Topicstarter
Ik probeer nu hetzelfde code ongeveer in een andere klasse te halen om de hoogste klantnummer eruit te halen en er 1 bij op te tellen.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
        Bank bank = Bank.getInstance();

        int knr = bank.klantTeller();
        if (klanten == null || klanten.isEmpty()) {
          int i = 1;
        } else {
          for (i=0; i<knr; i++) {
              i = knr + 1;
          }
          return i;
        }

        tf6.setText(i);


E:\Project\gui\KlantToevoegenGui.java:72: cannot return a value from method whose result type is void
return i;
^
E:\Project\gui\KlantToevoegenGui.java:75: setText(java.lang.String) in javax.swing.text.JTextComponent cannot be applied to (int)
tf6.setText(i);

Tweede error gaat neem ik aan over dat setText alleen een String variabele kan ophalen en geen int? Dus dan moet ik het omzetten naar een String variabele.

Verwijderd

Topicstarter
Tweede foutmelding heb ik snel verholpen:
Java:
1
2
        String knrString = Integer.toString(i);
        tf6.setText(knrString);

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

De eerste is ook vrij duidelijk:
cannot return a value from method whose result type is void
Dit betekent letterlijk: "je kunt een void methode geen waarde laten retourneren".

Nogmaals, lees de Java Tutorial gewoon op je gemak geheel door. Je bent bij de 'Elementen' blijven steken. Daar staat het nota-bene op ;)

Verwijderd

Topicstarter
Ik ben inderdaad niet echt netjes bezig :/

"Er kunnen methoden zijn die helemaal niet antwoorden, dan moet je als element type void invullen."

Inmiddels verholpen, maar ik krijg op het scherm de nummer 0 te zien. Ik denk zelf dat er wat mis gaat bij het converteren van String naar int.

edit: nope gaat niet fout bij het converteren, heb het net even uitgetest met door een andere nieuwgemaakte int een waarde te geven en die te converteren. FF verder kijken dus :p

[ Voor 23% gewijzigd door Verwijderd op 16-04-2007 14:46 ]


Verwijderd

Topicstarter
Ik heb het even doorgenomen en zie dat bank.klantTeller() de waarde 0 teruggeeft alleen kan er niet echt opkomen waarom, want bank is al geinitialiseerd.

[ Voor 31% gewijzigd door Verwijderd op 16-04-2007 14:58 ]


  • Marcj
  • Registratie: November 2000
  • Laatst online: 01-12 16:59
Als je een goede IDE gebruikt kun je toch wel met de debugger kijken wat de klantTeller() functie precies doet en waarom die 0 is? Gewoon een breakpoint direct voordat je de klantTeller() functie aanroep zetten en dan de debug modus starten. Welke IDE gebruik je? (Of gebruik je geen, dan kan ik je wel Eclipse aanraden)

Verwijderd

Topicstarter
Inmiddels heb ik dit opgelost, maar ben ik beland op een ander probleem.

Tot dusver hadden we de klanten toegevoegd via main:
Java:
1
2
bank.addKlant(new Klant(1, "Piet", "Anjerstraat 57 ", "Hengelo", ""));
bank.addKlant(new Klant(2, "Jan", "Loopweg 32", "Zoetermeer", ""));


Bij het opstarten van de KlantToevoegenGui krijg ik de klantnummer 3 te zien wat dus klopt, omdat er maar 2 klanten zijn, en als ik op OK klik dan voegt die de klant toe aan het bestand klanten.bank Maar het vage hiervan is dat zodra ik het programma opnieuw start alleen de twee oude klanten nog bestaan en de nieuwe klant is verwijderd.

Een klant toevoegen gaat zo:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == b1){
            Bank bank = Bank.getInstance();
            bank.addKlant(new Klant(knr, tf1.getText(), tf3.getText(), tf4.getText(), ""));
            bank.save();
            dispose();
            new KlantBeheerGui();
        }

        if(e.getSource() == b2){
            dispose();
            new KlantBeheerGui();
        }
    }

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Dan werkt je save niet, of je load! De twee bestaande klanten voeg je immers in de de main al toe als je het proggie start.

Do diamonds shine on the dark side of the moon :?


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Ik zie nergens dat je je load aanroept. Ik zie alleen dat je enkele constante waarden toevoegd aan je class bij het initialiseren. Had je soms verwacht dat door die bank.save() je sourcecode aangepast werd oid?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
voodooless schreef op dinsdag 17 april 2007 @ 11:31:
Dan werkt je save niet, of je load! De twee bestaande klanten voeg je immers in de de main al toe als je het proggie start.
Maar als de save niet werkt dan kan die toch helemaal niks toevoegen? Als ik op OK klik en de applicatie nog niet afsluit dan zie ik dat het bestand klanten.bank is aangepast en de klant is toegevoegd, maar zodra ik het opnieuw start dan wordt die blijkbaar opnieuw aangemaakt in de oude versie.
Janoz schreef op dinsdag 17 april 2007 @ 11:35:
Ik zie nergens dat je je load aanroept. Ik zie alleen dat je enkele constante waarden toevoegd aan je class bij het initialiseren. Had je soms verwacht dat door die bank.save() je sourcecode aangepast werd oid?
Dat dacht ik dus, maar zo te zien moet load er ook nog bij? Waar en waarom moet ik load dan toevoegen?

Thnx!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Is het niet handig om te kijken naar een databasekoppeling. Dat is veel makkelijker, zeker als je iets als hybernate i.c.m HSQLDB gebruikt. Dan krijg je databaseabstractie, creatie en objectbeheer in een klap cadea zonder er veel voor hoeven te doen, zeker als je annotations van hybernate gebruikt.

Over de load: denk daar maar eens heel hard zelf over na! Zo moeilijk kan dat niet zijn.

[ Voor 13% gewijzigd door voodooless op 17-04-2007 11:42 ]

Do diamonds shine on the dark side of the moon :?


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Mwah, ik vermoed dat bank en klant aangeleverde klasses zijn van de leraar en dat de opdracht is een bank te schrijven. Gezien dit topic komen deze studenten daar helemaal niet uit. Dat je op een gegeven moment nog wel hebt kunnen bedenken dat je ergens klanten in een bank stopt, maar vervolgens moet vragen waar je de load zou moeten neerzetten sterkt mijn vermoeden alleen maar dat ze geen idee hebben waar ze mee bezig zijn.

Ik wil TS dan ook maar aanraden om naar zijn docent te gaan en hem eens om uitleg vragen en in het vervolg iets beter opletten wanneer de onderwerpen in de klas behandeld worden. Je hebt namelijk geen idee waar je mee bezig bent.

We moeten, zoals ik eerder ook al aangaf, maar niet beginnen over serializen en O/R mappers.

[ Voor 6% gewijzigd door Janoz op 17-04-2007 11:46 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Je hebt gelijk, de lessen heb ik niet echt gevolgd en dat zorgt nu idd voor problemen, maar ik heb nu ook door dat er een load bij moet zitten, want de bestand die wordt geschreven blijft nog met de nieuwe klant bestaan totdat ik weer bij het opnieuw starten op OK klik dan begint die weer opnieuw, het probleem is dus dat ik eerst load moet gebruiken om ook die laatste toegevoegde klant te laden en dan pas opnieuw toevoegen, denk ik? Of zit ik er weer helemaal naast?

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

't is toch echt heel simpel: als je iets wil bewaren over meerder sessies van je programma, dan zul je die data moeten opslaan, maar ook weer moeten inladen bij het opstarten.

Die save van jou slaat dus niet alleen de toegevoegde klant op, maar ook die twee, die je er in de main zelf bij zet. Ga je een load doen, dan staan die twee die je er in de main bij zet, dubbel in (aangezien je die immers in de main toevoegt en via de load inlaadt).

Do diamonds shine on the dark side of the moon :?


Verwijderd

Topicstarter
En idd het is nu opgelost, ik moest ook even voor de klantnummer load aanroepen omdat anders de klantnummer op 1 bleef staan.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 07:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

flowerp schreef op zaterdag 14 april 2007 @ 13:41:
Dat is wel een erge high-level optimalisatie zeg. Zo op het eerste oog lijkt het triviaal, maar dat is het zeker niet. De JVM moet dan -exact- weten wat een Vector.add precies doet, en wat een AbstractList.Iterator().next() precies terug geeft en intern potentieel kan doen.

Misschien dat ik wel mijn eigen AbstractList heb geschreven (de JVM staat namelijk los van de JDK class lib), waarbij de next() functie intern naar de clock kijkt en op Pasen de String 'Pasen' terug geeft.

Voor een programmeur natuurlijk een onzin functie, maar de JVM zal dus alle code van alle betrokken classen moeten nalopen. Ze mag er zeker niet van uitgaan dat Vector.add een vaststaande operatie is.
De vm doet de optimalisatie natuurlijk @ runtime, en hij kan zien dat alle aangeroepen functies compleet stateless zijn (dus geen globale variabelen en hardware accessen). Wat dus wil zeggen dat de code in dat geval altijd hetzelfde zal opleveren bij dezelfde input, waardoor de compiler de uiteindelijke output kan cachen, ongeacht wat die code nou eigenlijk doet.

Of de vm dergelijke optimalisaties doet weet ik niet, daar heb ik verder geen verstand van, maar het is op zich trivialer dan jij nu denkt :). En dit is dan tevens ook een van de grote voordelen van een JIT compiler tov een static compiler.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik hoop niet dat ik jullie nu boos maak als ik met nog een vraag kom, maar ik was hiermee al op school bezig met zo'n anderen jongen uit de projectgroep, maar we kwamen er maar niet uit, en nu lukt het ook niet.

Ik heb twee klassen, KlantGui en KlantMenuGui.

Codes van KlantGui
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public String klantNummer;
 
//knr
knr = new JTextField(10);
p2.add(knr);
 
//getValue
public String getValue() {
    return knr.getText();
}
 
//getKlantNummer
public String getKlantNummer(){
    klantNummer = getValue();
    return klantNummer;
}


Java:
1
2
3
4
5
6
7
8
9
private KlantGui kg = new KlantGui();
 
//Data moet hier dus getoond worden.
String klantnr = kg.getKlantNummer();
p2.add(new JLabel (" Klantnr: "));
tf4 = new JTextField (10);
p2.add(tf4);
tf4.setEditable(false);
tf4.setText(klantnr);


Ik heb van alles geprobeerd maar getValue stuurt de data niet door. Als ik bijvoorbeeld klantNummer = "2" ipv klantNummer = getValue(); intyp dan wordt het getal 2 wel doorgestuurd.

Om in te loggen (KlantGui) heb je een klantnummer nodig en na het inloggen krijg je dus het scherm KlantMenuGui te zien. De bedoel is dat ik de klantnummer laat zien EN gebruik om de bijhorende data (naam, adres, woonplaats) die ik heb toegevoegd in de vector laad uit de aangemaakte bestand, hoe dat precies gaat zit ik ook nog mee en ik hoop dat jullie wat tips hebben daarvoor.

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Je maakt die klantgui aan, en net erna vraag je de waarde op van het klantnummer. Aangezien je die uit een textveld haalt zal deze wel leeg zijn. Als je die achteraf invult zal deze natuurlijk niet op miraculeuze wijze Tf4 aanpassen.

tip: duik eens wat verder in guiprogrammeren!

Als je trouwens echt wel java wil leren heb ik nog wel een andere tip: download het boek van Bruce Eckel: "Thinking in Java". Het eennalaatste deel kun je gewoon als doc of pdf downloaden. prima boek, veel beter dan de meuk die ze op scholen verplicht stellen. Wie begint er dan ook met GUI proggen als men nog niet eens de taal en OO principes onder de knie heeft...

[ Voor 39% gewijzigd door voodooless op 17-04-2007 21:26 ]

Do diamonds shine on the dark side of the moon :?


Verwijderd

Topicstarter
Bedankt, ik heb zelf inmiddels ook al een paar e-books gedownload om het goed onder de knie te krijgen en ik zal dat boek ook downloaden, maar helaas had ik hier eerder aan moeten beginnen :p

Het klinkt idd logisch dat de textfield leeg zal zijn als die het opvraagt als ik er zo naar kijk, maar ik zie niet echt een manier om het op te lossen.

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

De grote vraag is: wat wil je eigenlijk doen? Ik zie niet echt het nut van het kopieren vaan de value van een tekstveld naar het andere.

sowiso is het zaak een goede scheiding te maken tussen je gui en je entiteiten als Klant, Bank, enz... een Klant is een Klant, en ee gui moet die Klant gebruiken. Het moet geen brei van doorelkaar lopende code worden, daar maak je het jezelf alleen maar lastig mee.

[ Voor 49% gewijzigd door voodooless op 17-04-2007 21:43 ]

Do diamonds shine on the dark side of the moon :?


Verwijderd

Topicstarter
Nou de bedoeling is dat ik de klantnummer laat tonen EN gebruik om de bijhorende data (naam, adres, woonplaats) die ik heb toegevoegd in de vector laad uit de aangemaakte bestand, hoe dat precies gaat zit ik ook nog mee en ik hoop dat jullie wat tips hebben daarvoor.

In KlantMenuGui komen er labels met textfields waarin de opgehaalde informatie komt te staan. Bijv:
Naam: (label) - Piet (textfield)

de textfield is dan uiteraard non editable :p

Een klant heeft ook nog een rekening en dus moet er een data (in dit geval de klantnummer) opgehaald worden om de bijhorende rekeningen te tonen, toch?

Je hebt overigens gelijk over de manier hoe de code is geschreven allemaal. We hebben zo'n beetje alles door elkaar gedaan en dat zorgt ook nog voor onoverzichtelijkheid.

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Dat laatste is precies de rede waarom het ontwepproces zo belangrijk is. Helaas is daarbij basiskenis een must have. Ik snap dan ook niet hoe docenten een dergelijke opgave in een dergelijk stadium verstrekken. Maar goed, dat is een ander verhaal en het zal jou helaas ook niet verder helpen ;)

wat betreft je probleem: je hebt dus een invoerveld waar je je referentienummer uit haalt. Vervolgens laad je de rest van de gegevens erbij, en displayed ze. Wat je nu moet doen is een event maken om dat voor je af te handelen. Dat koppel je aan je invuleld of aan een knop ernaast. Dat event laat je de gegevens ophalen en weergeven (aka bestaande gui elementen vullen/updaten).

Ik ben expres wat cryptisch. Niet om je te plagen, maar om je te dwingen om er wat verder in te duiken. Zelf uitzoeken (eventueel aan de hand van hints) is wat mij betreft de beste methode om te leren. Bovendien type ik dit vanaf een Nokia E70 en heb ik zeker geen zin om daar code mee te typen (ondanks qwerty toetenbord) :+

[ Voor 19% gewijzigd door voodooless op 17-04-2007 22:09 ]

Do diamonds shine on the dark side of the moon :?


Verwijderd

Topicstarter
Dus als ik het goed begrijp moet ik de textfields doorgeven aan de event en dan is het mogelijk om de klantnummer in de volgende klasse te laden?

Laat ik maar eens opnieuw beginnen. Ik heb een klasse KlantGui, dit is een log-in klasse, waarmee je met een klantnummer kan inloggen, er staat een passwordfield bij maar die staat er voor de lol, die wordt dus (nog) niet gebruikt.

Bij het invullen van de klantnummer en daarna het klikken op OK wordt er dus een event in werking gesteld.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == b2){
            dispose();
            new HoofdmenuGui();
        }
        else if(e.getSource() == b1){
            String s = getValue();
            if(cl.controlKlant(s)) {
            new KlantMenuGui(kgc.getKlanten());
            dispose();
            }
            else {
                JOptionPane.showMessageDialog(null, "Klant bestaat niet.");
            }
        }
    }


Er wordt gecontroleerd of de klantnummer voorkomt en zo niet dan kan er niet worden ingelogd.

Komt het klantnummer wel voor dat wordt je doorgestuurd naar KlantMenuGui, daar wil ik dus de klantnummer weer ophalen, maar dat is mij tot zover nog niet gelukt. Als ik dan de klantnummer heb wil ik op de een of andere manier (nog uitzoeken hoe) de andere bijhorende gegevens laden.
Ik ben expres wat cryptisch. Niet om je te plagen, maar om je te dwingen om er wat verder in te duiken. Zelf uitzoeken (eventueel aan de hand van hints) is wat mij betreft de beste methode om te leren. Bovendien type ik dit vanaf een Nokia E70 en heb ik zeker geen zin om daar code mee te typen (ondanks qwerty toetenbord)
Hehe, zo leer ik idd wel beter :D Lol dat moet vast irritant lezen zijn elke keer :p

[ Voor 14% gewijzigd door Verwijderd op 17-04-2007 22:17 ]


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Lezen gaat prima op een E70 hoor :) textbreedt past prima op het display.

* voodooless moet tot 1 mei wachten op internet :(

Wat betreft je code: zo te zien leer je snel, maar je denkt soms te moeilijk. I.p.v alle klanten door te geven naar je klantenmenugui kun je ook alleen maar de benodigde klant doorgeven, of als je ze allemaal nodig hebt, ook nog het id dat je uit je tekstveld krijgt.

Bedenk altijd een aantal dingen:
- Wat heb ik nodig?
- Waar haal ik dat vandaan?
- Hoe krijg ik het daar waar ik het hebben wil?

[ Voor 14% gewijzigd door voodooless op 17-04-2007 22:44 ]

Do diamonds shine on the dark side of the moon :?


  • ID-College
  • Registratie: November 2003
  • Laatst online: 30-11 14:33
Wij moeten dit ook doen voor school. Heb je de code compleet?, dan kan ik een paar dingen vergelijken en aanpassen. Ik kom er zelf ook niet helemaal uit namelijk. Dat zou wel makkelijk zijn :)
Thnx :>

Verwijderd

Topicstarter
Dus als ik het goed begrijp moet ik eigenlijk de klant al met de gegevens in de event van KlantGui bepalen, zodat ik alleen die gegevens in de volgende klasse hoef te laden?

Om dan nog de klantnummer te tonen in de volgende klasse moet ik de klantnummer uit de vector halen met behulp van de ingevulde klantnummer, klopt het een beetje zoals ik het op dit moment zeg?
ID-College schreef op dinsdag 17 april 2007 @ 22:48:
Wij moeten dit ook doen voor school. Heb je de code compleet?, dan kan ik een paar dingen vergelijken en aanpassen. Ik kom er zelf ook niet helemaal uit namelijk. Dat zou wel makkelijk zijn :)
Thnx :>
Op welke school zit jij dan :P ?

[ Voor 32% gewijzigd door Verwijderd op 17-04-2007 22:58 ]


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Eerste deel klopt.

2e deel is onlogisch. Ik neem aan dat klant zijn eigen nummer wel kent? Zodoende kun je all info, dus ook het nummer uit Klant halen. Je hebt dus alleen klant nodig en voor de rest niks. Die haal je natuurlijk uit je vector van klanten (waarom is dat eigenlijk geen hashmap :? ).

Do diamonds shine on the dark side of the moon :?


  • ID-College
  • Registratie: November 2003
  • Laatst online: 30-11 14:33
Verwijderd schreef op dinsdag 17 april 2007 @ 22:52:
Dus als ik het goed begrijp moet ik eigenlijk de klant al met de gegevens in de event van KlantGui bepalen, zodat ik alleen die gegevens in de volgende klasse hoef te laden?

Om dan nog de klantnummer te tonen in de volgende klasse moet ik de klantnummer uit de vector halen met behulp van de ingevulde klantnummer, klopt het een beetje zoals ik het op dit moment zeg?


[...]


Op welke school zit jij dan :P ?
HU, en ik moet ongeveer ook dit maken vandaar :)

Verwijderd

Topicstarter
@ID-College, vind het een beetje risky, ik zit namelijk ook op de HU en dus hebben we beide dezelfde leraar :p Zou grappig zijn als je ook nog een klasgenoot zou zijn :D

Maarjah stuur maar een PM anders met je msn ofzo.

In ieder geval, in de klasse Bank had ik iets gemist, ik heb dit zelf niet toegevoegd dus ik kwam er net pas achter :p
Java:
1
2
3
4
5
6
7
8
    public Klant getKlant(int nummer) {
        for (Klant klant : klanten) {
            if (klant.getNummer() == nummer) {
                return klant;
            }
        }
        return null;
    }


In de event heb ik dit toegevoegd / gewijzigd
Java:
1
2
3
4
5
6
7
8
    int i = Integer.parseInt(s);
            if(cl.controlKlant(s)) {
                Bank bank = Bank.getInstance();
                bank.getKlant(i);

                new KlantMenuGui();
                dispose();
            }


Tot zover klopt het nog wel, maar ik zit nu nog te denken hoe ik verder moet.

Dit is iig de constructor van Klant:
Java:
1
2
3
4
5
6
7
8
9
    public Klant(int nummer, String nm, String ad, String pl, String pw)
    {
        this.nummer = nummer;
        naam = nm;
        adres = ad;
        plaats = pl;
        password = pw;
        this.rekeningen = new Vector<Rekening>();
    }


pw staat eigenlijk overal voor de lol, maarjah..

  • ID-College
  • Registratie: November 2003
  • Laatst online: 30-11 14:33
Dat zou wel mooi zijn. Je kan een PM (DM :?) sturen hoor. Jij hebt het uitstaan onder voorkeuren, je wilt er geen ontvangen staat er :)
Ik weet niet hoever jij bent, maar wij zijn ook al aardig op weg, ga het natuurlijk niet kopieeren. Valt een beetje op en ga wat ik nu heb niet weggooien uiteraard :)
sorry voor offtopic :)

Verwijderd

Topicstarter
Het lukt nog niet echt :p

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//een hoop andere code

public class KlantGui extends JFrame implements ActionListener{
    private JPanel p1,p2,p3;
    private JButton b1, b2;
    private JTextField knr;
    private Klant klant;
    private Bank bank;
    public String klantNaam;
    public String klantAdres;
    public String klantPlaats;

//een hoop andere code

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == b2){
            dispose();
            new HoofdmenuGui();
        }
        else if(e.getSource() == b1){
            String s = getValue();
            int i = Integer.parseInt(s);
            if(cl.controlKlant(s)) {
                Bank bank = Bank.getInstance();
                bank.getKlant(i);
                klantNaam = klant.getNaam();
                klantAdres = klant.getAdres();
                klantPlaats = klant.getPlaats();

                JOptionPane.showMessageDialog(null, klantNaam);
                //new KlantMenuGui();
                //dispose();
            }
            else {
                JOptionPane.showMessageDialog(null, "Klant bestaat niet.");
            }
        }
    }


Dit zou het toch moeten doen?

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Ligt eraan wat het is ;)

Do diamonds shine on the dark side of the moon :?


Verwijderd

Topicstarter
Dat de gegevens worden van de klant met klantnummer i, zodat ik ze in de andere klasse kan halen.

KlantGui
Java:
1
2
3
                klantNaam = "3";
                //klantAdres = klant.getAdres(); 
                //klantPlaats = klant.getPlaats(); 


Dat krijg ik dan wel in de message box te zien, maar de volgende gui opent die alleen een leg scherm :p


KlantGuiMenu
Java:
1
2
3
4
5
6
7
//hoop code

private KlantGui kg;

//hoop code

tf1.setText(kg.klantNaam);

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op dinsdag 17 april 2007 @ 23:33:
In de event heb ik dit toegevoegd / gewijzigd
Java:
1
2
3
4
5
6
7
8
    int i = Integer.parseInt(s);
            if(cl.controlKlant(s)) {
                Bank bank = Bank.getInstance();
                bank.getKlant(i);

                new KlantMenuGui();
                dispose();
            }


Tot zover klopt het nog wel, maar ik zit nu nog te denken hoe ik verder moet.
de methode getKlant(i) in bank levert een klant op. Jij doet vervolgens niks met de klant. Nergens vang je die klant in op. Je moet de klant toekennen aan een variabele. Klant klant = bank.getKlant(i);. Vervolgens kun je van alles met die klant doen. Bijvoorbeeld doorgeven aan de andere GUI. Ik zeg het nogmaals. En waarom roep je eigenlijk dispose aan?

Dit zijn echt de meest simpele basis beginselen van programmeren ansich. Door zo maar te blijven aan prutsen gaat het nooit wat worden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Dom dom dom.. Je hebt helemaal gelijk.

Ik krijg nu de gegevens in dezelfde klasse al, nu nog alleen in de andere klasse zien te krijgen, want dat doet die nog niet, ik zal er even goed naar kijken en die site doornemen, want dit lijkt mij ook weer iets wat je al in het begin eigenlijk al moet weten :p

dispose() gebruiken we om de vorige scherm te sluiten als er een nieuwe wordt geopend.

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Denk aan de basisregels, dan kom je al een heel eind zonder die domme fouten!
voodooless schreef op dinsdag 17 april 2007 @ 22:41:
Bedenk altijd een aantal dingen:
- Wat heb ik nodig?
- Waar haal ik dat vandaan?
- Hoe krijg ik het daar waar ik het hebben wil?

Do diamonds shine on the dark side of the moon :?


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Als je hem in de andere klasse wilt krijgen moet je hem aan die andere klasse geven

Als je nu ens de constructor van KlantMenuGui aanpast dat je daar een klant aan mee kunt geven, dan heb je die klant ook in de KlantMenuGui instantie.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Ik heb het! :p

Java:
1
new KlantMenuGui(klantNaam, klantAdres, klantPlaats);


Java:
1
2
    public KlantMenuGui (String klantNaam, String klantAdres, String klantPlaats) {
        super();


Beetje dom allemaal nu ik er zo naar zie te kijken :+

Leraar kwam net met een andere oplossing, dat de gegevens pas in de volgende klasse worden geladen. Hij had dit naar een jongen uit onze projectgroep gemaild. Hij zei dat dat beter is :? Maarjah dit doet het in ieder geval ook :P

Verwijderd

Verwijderd schreef op woensdag 18 april 2007 @ 11:45:
Ik heb het! :p

Java:
1
new KlantMenuGui(klantNaam, klantAdres, klantPlaats);


Java:
1
2
    public KlantMenuGui (String klantNaam, String klantAdres, String klantPlaats) {
        super();


Beetje dom allemaal nu ik er zo naar zie te kijken :+

Leraar kwam net met een andere oplossing, dat de gegevens pas in de volgende klasse worden geladen. Hij had dit naar een jongen uit onze projectgroep gemaild. Hij zei dat dat beter is :? Maarjah dit doet het in ieder geval ook :P
Ik zit ook op de HU en heb precies dezelfde opdracht. Die van ons is al af, maar het is de bedoeling dat je vanuit je controller-klasse een nieuwe UI opbouwt en vanuit de controller klasse de componenten(textarea's, textfield's enz.) invult.

  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

Waarom geef je niet gewoon het klant-object mee aan die constructor?
Dus:
Java:
1
2
3
4
5
6
public KlantMenuGui(Klant klant) {
  this.klant = klant;
  // een hoop andere dingen
}
// in KlantGui:
new KlantMenuGui(klant);

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Weer niet zo moeilijk denken en doen wat NetForce zegt: Klant doorgeven i.p.v de losse velden.

Do diamonds shine on the dark side of the moon :?


Verwijderd

Topicstarter
Ik heb het nu gedaan zoals NetForce1 het zei, dat is inderdaad makkelijker en slimmer :p

@TNT Bomber: JZ heeft al meerdere keren de applicatie bekeken en hij zei er niets van dus hopelijk blijft dat ook zo, ik heb geen tijd meer om ook nog de hele applicatie te gaan veranderen.

Verwijderd

Verwijderd schreef op woensdag 18 april 2007 @ 13:51:
Ik heb het nu gedaan zoals NetForce1 het zei, dat is inderdaad makkelijker en slimmer :p

@TNT Bomber: JZ heeft al meerdere keren de applicatie bekeken en hij zei er niets van dus hopelijk blijft dat ook zo, ik heb geen tijd meer om ook nog de hele applicatie te gaan veranderen.
Wij hebben dus een andere docent ;)

Verwijderd

Topicstarter
Ik ben nu alweer wat verder en ik probeer de waardes in de vector te wijzigen.

Mbv http://balusc.xs4all.nl/srv/dev-jsw-col.html heb ik heel wat codes geprobeerd, maar werken doen ze niet :p

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == b1){
            int klNummer = klant.getNummer();
            String kl = klant.getNaam();
            Bank bank = Bank.getInstance();
            Klant klant = bank.getKlant(kl);
            bank.load();
            klanten.add(klNummer, new Klant(klNummer, tf1.getText(), tf2.getText(), tf3.getText(), ""));
            bank.save();

            dispose();
            new KlantBeheerGui();
        }

        if(e.getSource() == b2){
            dispose();
            new KlantBeheerGui();
        }
    }


Ik heb ook eens op google rondgezocht maar de voorbeelden die ik heb gevonden, ook via de bovengenoemde site gaan over het wijzigen van 1 element blijkbaar, nou weet ik niet of het daaraan ligt dat het niet werkt..

Verwijderd

Topicstarter
Even aan de basisregels zitten denken en goed zitten nadenken en ik ben eruit :p

In de Bank klasse een methode setKlant(int nummer, Klant klant) toegevoegd en dat gebruikt om te wijzigen:

Java:
1
bank.setKlant(klNummer, (new Klant(klNummer, tf1.getText(), tf2.getText(), tf3.getText(), "")));

[ Voor 3% gewijzigd door Verwijderd op 18-04-2007 19:39 ]


Verwijderd

Topicstarter
Huh ik heb nu ook een methode voor het verwijderen van een account en het werkte net, maar bij sommige accounts werkt die niet.

Ik krijg dan een arrayindexoutofboundexception foutmelding.

Ik merk trouwens wel op dat als ik vier klanten heb en ik de 3e klant verwijder dat de vierde klant dan zijn klantnummer krijgt en als ik die dan probeer te verwijderen krijg ik dat foutmelding.

Wijziging gegevens klasse
Java:
1
2
3
4
5
6
7
8
9
10
11
12
        else if(e.getSource() == b2){
            int reply = JOptionPane.showConfirmDialog(null, "Weet je zeker dat je de account van " + tf1.getText() + " uit het database wilt verwijderen?", "Verwijderen Account", JOptionPane.YES_NO_OPTION);
                if(reply == JOptionPane.YES_OPTION){
                    dispose();

                    bank.load();
                    bank.verwijderKlant(klNummer);
                    bank.save();

                    new KlantBeheerGui();
                }
        }


Bank:
Java:
1
2
3
4
    public void verwijderKlant(int nummer){
        klanten.remove(nummer);
        save();
    }

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Vector index != klantnummer.

ik zeg het nog een keer: check eens een HashMap als vervanging voor je Vector. Dat werkt veel intuitiever en is vermoedelijk oom nog eens sneller.

Do diamonds shine on the dark side of the moon :?


Verwijderd

Topicstarter
Ik wil het graag doen, maar alles is nu met een vector geregeld en een andere jongen is met de andere bestanden bezig dus ik weet niet of dat nog gaat lukken. Opdracht moet ook nog eens morgenochtend worden gepresenteerd dus ik heb wel heel wat te doen vannacht :p Maar als er geen optie is dan moet het maar...

Ik dacht al zoiets dat klantnummer geen index zou zijn :p, maar ik dacht dat het werkte dus vond ik het goed zo totdat dat foutmelding kwam.

public Object remove(int index)
"Removes the element at the specified position in this Vector. shifts any subsequent elements to the left (subtracts one from their indices). Returns the element that was removed from the Vector."

Hmm.. ik weet eigenlijk niet hoe ik het dan moet oplossen, ik dacht dat het met de klantnummer goed zat :'(

  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

Het mooiste is natuurlijk om het zaakje om te schrijven naar HashMap zoals voodooless aangeeft. Je kunt bank.getKlanten dan nog steeds een Vector terug laten geven:
Java:
1
2
3
public Vector getKlanten() {
  return new Vector(clientsById.values());
}

Als dit niet gaat lukken zul je bij het verwijderen over al je klanten moeten lopen en het klantnr vergelijken:
Java:
1
2
3
4
5
6
7
8
9
public void verwijderKlant(int klantNr) {
  Iterator<Klant> it = klantent.iterator();
  while (it.hasNext()) {
    if (it.next().getNummer() == klantNr) {
      it.remove();
      return;
    }
  }
}

Of nog makkelijker, geef gewoon de klant mee:
Java:
1
2
3
public void verwijderKlant(Klant klant) {
  klanten.remove(klant);
}

Voor deze laatste methode moet je wel equals overriden in Klant (zie javadoc van Object)
Java:
1
2
3
4
5
6
7
8
9
public boolean equals(Object that) {
  if (that == this) {
    return true;
  }
  if (that == null || !(that instanceof Klant)) {
    return false;
  }
  return Klant.class.cast(that).getNummer() == this.getNummer();
}

edit:
verhaaltje over equals

[ Voor 20% gewijzigd door NetForce1 op 18-04-2007 21:10 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Dat laatste is alleen nodig als je meerdere instanties van de zelfde klant hebt natuurlijk. Vage manier van casten trouwens :) Zo leer je nog eens wat.

Do diamonds shine on the dark side of the moon :?


  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

voodooless schreef op woensdag 18 april 2007 @ 21:16:
Dat laatste is alleen nodig als je meerdere instanties van de zelfde klant hebt natuurlijk. Vage manier van casten trouwens :) Zo leer je nog eens wat.
Ja, dat casten kan vanaf java 5, daar werd ik laatst op gewezen door een collega. Bij de traditionele manier van casten krijg je vaak een woud van haakjes wat het geheel niet echt leesbaarder maakt.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Verwijderd

Topicstarter
Bedankt! Nu ik dit opgelost heb kom ik op een ander probleem terecht waarvan ik ook dacht dat die het deed.

Om Klantgegevens te wijzigen krijg je eerst een Gui waarin je uit een dropdown box een klant selecteert en als je op OK klikt wordt je doorgestuurd naar de andere GUI met de gegevens. Het probleem is dat als ik een klant wijzig dat de laatste klant van de dropdown box wordt gewijzigd. Ik denk zelf dat het hetzelfde probleem is als van net omdat ik hier ook klantnummer als index had gebruikt.

Gui om klant te selecteren
Java:
1
2
3
4
5
6
7
8
9
10
        if(e.getSource() == b1){
            String kNaam = (String) box1.getSelectedItem();

            Bank bank = Bank.getInstance();
            Klant klant = bank.getKlant(kNaam);

            new KlantGegevensWijzigenGui(klant);
            dispose();

        }


Gegevens wijzigen Gui
Java:
1
2
3
4
5
6
7
8
9
10
11
12
    public void actionPerformed(ActionEvent e) {
        Bank bank = Bank.getInstance();
        int klNummer = klant.getNummer();
        if(e.getSource() == b1){

            bank.load();
            bank.setKlant(klNummer, (new Klant(klNummer, tf1.getText(), tf2.getText(), tf3.getText(), "")));
            bank.save();

            dispose();
            new KlantBeheerGui();
        }



Ik denk zelf dat dit zou moeten werken:
Java:
1
2
3
4
5
6
7
8
9
10
11
    public void setKlant(int nummer, Klant klant){
      Iterator<Klant> it = klanten.iterator();
      while (it.hasNext()) {
        if (it.next().getNummer() == nummer) {
          klanten.set(....index...., klant);
          return;
        }
        save();
      }

    }


Maar wat moet daar dan als index worden ingevoerd?

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Waarm is er een methode setklant die steeds de klant overschrijft? Je kunt gewoom met getters de klant aanpassen, is veeeeeel makkelijker. Wat je nu doet gaat inderdaad fout.

Do diamonds shine on the dark side of the moon :?


  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

Je zou dat zo kunnen doen:
Java:
1
2
3
4
5
6
7
8
public void setKlant(int nummer, Klant klant) {
  if (klanten.contains(klant)) {
    klanten.set(klanten.indexOf(klant), klant); //let op: hiervoor moet equals geimplementeerd zijn op Klant
  } else {
    klanten.add(klant);
  }
  save();
}

Maar dit hoeft allemaal helemaal niet nodig te zijn. Als je ervoor zorgt dat je altijd maar een instantie van een bepaalde klant hebt zijn wijzigingen op dat object ook doorgewerkt in de lijst. De variabele 'klant' waarmee je bezig bent is niets anders dan een verwijzing naar een object van het type Klant. Het element in de vector heeft ook een verwijzing naar ditzelfde object. Wijzigingen die je doet via de ene variabele zijn dan dus overal doorgewerkt waar een verwijzing naar dat object gebruikt wordt.
Bovenstaande is wellicht een beetje moeizaam uitgelegd, er zijn gelukkig talloze tutorials en leraren die dat beter kunnen dan ik ;)
Je hoeft in je actionPerformed dus geen nieuw Klant object aan te maken. Doe je wijziging op het object wat je daar al hebt en roep dan bank.save() aan.
voodooless schreef op woensdag 18 april 2007 @ 21:48:
Waarm is er een methode setklant die steeds de klant overschrijft? Je kunt gewoom met getters de klant aanpassen, is veeeeeel makkelijker. Wat je nu doet gaat inderdaad fout.
setters toch zeker? ;)

[ Voor 12% gewijzigd door NetForce1 op 18-04-2007 22:01 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 30-11 11:20

voodooless

Sound is no voodoo!

Heb niet de illusie dat docenten dat beter kunnen. Je gaat me niet wijs maken dat al die kennis van je afkomstig is van een docent. Ik durf wel te wedden dat je het meest zelf ontdenkt hebt :P (het mag ondertussen wel duidelijk zijn wat ik van docenten denk ;) ( uizonderingen zullen ook hier de regel wel bevestigen). Toen mijn docent me vertelde dat ie mijn UML diagram niet snapte, dat het te ingewikkeld was en nooit ging werken, heb ik allw hoop verloren. Zeker toen drie weken later de applicatie af was, volgens het UML diagram werkte, en ook nog eens prima presteerde :P

anyway, ik was net beizg het bovenstaande verhaal ook nog eens te verduidelijken toen iemand mij belde, en dus mijn browser werd gesloten :( Nouja, jou uitleg is toch duidelijker :)

En natuurlijk bedoel ik setters i.p.v getters. Gebruik eclipse, dan kun je dat soort dingen heel makkelijk genereeren!

[ Voor 7% gewijzigd door voodooless op 18-04-2007 22:10 ]

Do diamonds shine on the dark side of the moon :?


Verwijderd

Topicstarter
Dus als ik het goed begrijp dan hoef ik alleen de getters eigenlijk op te vragen in de event, voor bank.save(); en dan wordt de oude naam al overschreven?

Dit is wat ik er ongeveer uithaal, maar de waarde blijft gewoon hetzelfde:
Java:
1
2
3
4
5
6
7
8
9
10
11
    public void actionPerformed(ActionEvent e) {
        Bank bank = Bank.getInstance();
        int klNummer = klant.getNummer();
        if(e.getSource() == b1){

            klant.getNaam();
            bank.save();

            dispose();
            new KlantBeheerGui();
        }


Waarschijnlijk is het weer iets knulligs wat ik niet doorheb |:(

edit: aah ik dacht zelf ook aan setters maar ik probeerde zelf klant.getNaam(); = klant.setNaam(); en dat werkte niet (:p) dus dacht ik dat het vast alleen om getters gingen.

Nu maar eens met setters proberen weer.

edit2:
Dat werkt inderdaad, veel makkelijker ook nog :|

Ongelooflijk dat ik al uren met dit allemaal bezig ben..

Java:
1
2
String klantNaam = tf1.getText();
klant.setNaam(klantNaam);

[ Voor 27% gewijzigd door Verwijderd op 18-04-2007 22:17 ]


  • NetForce1
  • Registratie: November 2001
  • Nu online

NetForce1

(inspiratie == 0) -> true

voodooless schreef op woensdag 18 april 2007 @ 22:07:
Heb niet de illusie dat docenten dat beter kunnen. Je gaat me niet wijs maken dat al die kennis van je afkomstig is van een docent. Ik durf wel te wedden dat je het meest zelf ontdenkt hebt :P (het mag ondertussen wel duidelijk zijn wat ik van docenten denk ;) ( uizonderingen zullen ook hier de regel wel bevestigen). Toen mijn docent me vertelde dat ie mijn UML diagram niet snapte, dat het te ingewikkeld was en nooit ging werken, heb ik allw hoop verloren. Zeker toen drie weken later de applicatie af was, volgens het UML diagram werkte, en ook nog eens prima presteerde :P
Ik heb inderdaad niet nog zoveel les van docenten genoten in de edele kunsten van het programmeer vak. Ik heb drie vakken gedaan op de eur met vrij hoog 'inleiding'-gehalte, maar ik had wel het idee dat de docenten wisten waar ze het over hadden. Ik had het overigens niet over mijn kennis, maar meer over mijn uitleg. Ik heb bij dit soort dingen regelmatig het idee dat het te wazig gaat worden als ik het in 'gewone mensen taal' probeer uit te leggen.
anyway, ik was net beizg het bovenstaande verhaal ook nog eens te verduidelijken toen iemand mij belde, en dus mijn browser werd gesloten :( Nouja, jou uitleg is toch duidelijker :)
Tjonge, dat valt dan weer alles mee :P
Verwijderd schreef op woensdag 18 april 2007 @ 22:11:
Dat werkt inderdaad, veel makkelijker ook nog :|

Ongelooflijk dat ik al uren met dit allemaal bezig ben..

Java:
1
2
String klantNaam = tf1.getText();
klant.setNaam(klantNaam);
Mooi!
Ik raad je overigens ten zeerste aan om duidelijke namen te gebruiken voor je variabelen. Dat komt de onderhoudbaarheid van je applicaties (en leesbaarheid voor de docent) zeker ten goed. Dus niet tf1 maar nameField bijv. en okButton of okBtn ipv b1.

[ Voor 16% gewijzigd door NetForce1 op 18-04-2007 22:27 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"

Pagina: 1 2 Laatste