[JAVA] Observer probleempje...

Pagina: 1
Acties:
  • 187 views sinds 30-01-2008
  • Reageer

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
Hoi, ik moet voor school een programma schrijven wat met bepaalde kleursliders werkt. Hier stukje source:
Klasse KleurApplet:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class KleurApplet extends Applet
{   Kleur k;
    KleurCanvas kc;
    RGBInvoerPaneel rgbip;
    HSBInvoerPaneel hsbip;

    public void init()
    {   // NB: mwt klassieke awt, niet met behulp van Swing-componenten.
        setLayout(new BorderLayout());
        k = new Kleur();
        kc = new KleurCanvas();
        add(kc, "Center");
        rgbip = new RGBInvoerPaneel(k);
        k.addObserver(rgbip);
        add(rgbip, "East");
        hsbip = new HSBInvoerPaneel(k);
        //k.addObserver(hsbip);
        add(hsbip, "West");
        setSize(600,340);
        setVisible(true);
    }
}


Klasse kleur:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Kleur extends Observable implements NumberListener{

    private int roodval;
    private int groenval;
    private int blauwval;

public Kleur()
    {   roodval = 127;
        groenval = 127;
        blauwval = 127;
        hsbvalues = Color.RGBtoHSB(roodval, groenval, blauwval, hsbvalues);
//      setBackground(Color.white);
//      setSize(360, 340);
    }

public void numberChanged(String naam, double v)
    {   if ( naam.equals("Rood") )
        {   roodval = (int)v;       // harde cast!! v loopt van 0 tot 255 met 0 decimalen!
....

        setChanged();
        notifyObservers();


update stukje uit klasse RGBpaneel :
Java:
1
2
3
4
5
6
7
8
class RGBInvoerPaneel extends Panel implements Observer

...

    public void update(Observable obs, Object obj) {
        System.out.println(k.getBlauwval());
        System.out.println(k.getRoodval());
        System.out.println(k.getGroenval());


In de klasse Kleur staan Roodval etc allemaal netjes inc Get methoden. Wanneer de kleur veranderd wordt er een setchanged en notifyobservers aangeroepen, dit gaat ook goed. Echter, hoe kan ik nu uit RGB paneel de getGroenval aanroepen, zoals ik het nu heb werkt het niet. Ik heb geprobeerd een nieuwe instantie van Kleur aan te maken binnen RGBpaneel maar dan zet ie vrolijk de waardes weer op 127... iemand een idee wat ik fout doe?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 13-02 20:06

Gerco

Professional Newbie

In je update method krijg je de observable mee die veranderd is. Wat je eigenlijk wilt doen is dit:

RGBInvoerPaneel:
Java:
1
2
3
4
5
6
7
    public void update(Observable obs, Object obj) {
        Kleur tmpKleur = (Kleur)obs;

        System.out.println(tmpKleur.getBlauwval());
        System.out.println(tmpKleur.getRoodval());
        System.out.println(tmpKleur.getGroenval());
    }


Overigens snap ik misschien je probleem niet goed, dus leg eens uit wat er gebeurt en wat je zou willen dat er gebeurt. "Het lukt niet" is geen goede probleemomschrijving.

[ Voor 26% gewijzigd door Gerco op 21-09-2006 12:12 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
Gerco schreef op donderdag 21 september 2006 @ 12:09:
In je update method krijg je de observable mee die veranderd is. Wat je eigenlijk wilt doen is dit:

RGBInvoerPaneel:
Java:
1
2
3
4
5
6
7
    public void update(Observable obs, Object obj) {
        Kleur tmpKleur = (Kleur)obs;

        System.out.println(tmpKleur.getBlauwval());
        System.out.println(tmpKleur.getRoodval());
        System.out.println(tmpKleur.getGroenval());
    }


Overigens snap ik misschien je probleem niet goed, dus leg eens uit wat er gebeurt en wat je zou willen dat er gebeurt. "Het lukt niet" is geen goede probleemomschrijving.
Wtf. is dat alles? Ik maakte dus ipv Kleur tmpKleur = (Kleur)obs;
Kleur k = new Kleur(), oftewel een nieuwe instantie met de waarden weer vrolijk op 127 :') Die System.Out.Println's waren overigens alleen om te testen of ik iets anders kreeg dan 127... dat kunnen nu dus echte funties worden. Oke, problem solved! Bedankt! ;)

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
StonedKinG schreef op donderdag 21 september 2006 @ 12:39:
[...]


Wtf. is dat alles? Ik maakte dus ipv Kleur tmpKleur = (Kleur)obs;
Kleur k = new Kleur(), oftewel een nieuwe instantie met de waarden weer vrolijk op 127 :') Die System.Out.Println's waren overigens alleen om te testen of ik iets anders kreeg dan 127... dat kunnen nu dus echte funties worden. Oke, problem solved! Bedankt! ;)
hm, ben er toch nog niet helemaal uit. Moet nu namelijk een kleur doorsturen naar een paint component, en dan werkt dit trucje niet :/ Aangezien de methode paint geen Kleur k kent...
Hoe doe ik dit?

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
public void paint(Graphics g) 
    {   
        //Kleur k = new Kleur();
        g.setFont(displayfont);
        Color c;
        // --- tint ----
        c = Color.getHSBColor(k.getHSBValues(0), 1, 1);             // helderheid, verzadiging vol
        paintKleurComponent("Tint", c, null, 30, 20, g);
        // --- verzadiging ----
        c = Color.getHSBColor(k.getHSBValues(0), k.getHSBValues(1), 1);     // helderheid vol
        paintKleurComponent("Verzadiging", c, null, 30, 100, g);
        // --- helderheid ----
        c = Color.getHSBColor(k.getHSBValues(0), 0, k.getHSBValues(2));     // verzadiging 0: grijs dus
        paintKleurComponent("Helderheid", c, null, 30, 180, g);
        
        // --- rood ----
        c = new Color(k.getRoodval(), 0, 0);
        paintKleurComponent("Rood", c, k.getEchtRood(), 270, 20, g);
        // --- groen ----
        c = new Color(0, k.getGroenval(), 0);
        paintKleurComponent("Groen", c, k.getEchtGroen(), 270, 100, g);
        // --- blauw ----
        c = new Color(0, 0, k.getBlauwval());
        paintKleurComponent("Blauw", c, k.getEchtBlauw(), 270, 180, g);
        
        // --- menging ----
        g.setColor(new Color(k.getRoodval(), k.getGroenval(), k.getBlauwval()));
        g.fillRoundRect(120, 40, 120, 280, 5, 5);       
        g.setColor(Color.black);
        g.drawString("De kleur", 120, 35);
        g.drawRoundRect(120, 40, 120, 280, 5, 5);       
        
        // --- hexadecimaal RGB  ---
        g.setColor(Color.black);
        g.drawString("Hex. RGB:", 270, 300);
        String hrgb = "#";
        hrgb = hrgb.concat(k.hexValue(k.getRoodval()));
        hrgb = hrgb.concat(k.hexValue(k.getGroenval()));
        hrgb = hrgb.concat(k.hexValue(k.getBlauwval()));
        g.drawString(hrgb, 270, 315);       
    }


Dit geeft dus nu enorme errors :X

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 12-02 09:57
Dat heeft niets meer met het observer pattern te maken maar met basis programmeer technieken.
Aangezien de paint methode geen Kleur parameter heeft in zijn signature, moet je dus ervoor zorgen dat hij dat Kleur object ergens anders haalt. Dit kan je bv stockeren in een instance variable die dus beschikbaar is voor heel je klasse, dus ook paint()

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
DaRKie schreef op donderdag 21 september 2006 @ 13:57:
Dat heeft niets meer met het observer pattern te maken maar met basis programmeer technieken.
Aangezien de paint methode geen Kleur parameter heeft in zijn signature, moet je dus ervoor zorgen dat hij dat Kleur object ergens anders haalt. Dit kan je bv stockeren in een instance variable die dus beschikbaar is voor heel je klasse, dus ook paint()
Dat de observer wel werkte was ik ook achter ;) Maar hoe kan ik dit het beste aanpakken? Want zoals je al zegt kun je aan een paint component behalve Graphics G niets meegeven.. een public Kleur k bovenaan de klasse geeft nullpointerexceptions...

[ Voor 15% gewijzigd door Wijnbo op 21-09-2006 14:09 ]


  • Appesteijn
  • Registratie: Juni 2001
  • Niet online
Dus als je Kleur() aanmaakt in de KleurApplet, maak je daar new Kleur(this) van. En dan kan je in Kleur.java: public Kleur(variabele) gebruiken om k wel ergens naar te laten verwijzen.

[ Voor 38% gewijzigd door Appesteijn op 21-09-2006 14:37 ]


  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
Appesteijn schreef op donderdag 21 september 2006 @ 14:32:
Dus als je Kleur() aanmaakt in de KleurApplet, maak je daar new Kleur(this) van. En dan kan je in Kleur.java: public Kleur(variabele) gebruiken om k wel ergens naar te laten verwijzen.
Eh, volgens mij snap ik je niet helemaal... Wanneer ik dat doe krijg ik bij KleurCanvas nog steeds k cannot be resolved...


Kleurapplet :

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
/*
 * KleurApplet.java     13 maart 2003, Paul Bergervoet
 *
 * Applet toont kleurenmenger 
 */

package kleurapplet;

import java.awt.*;
import java.applet.*;

public class KleurApplet extends Applet
{   Kleur k;
    KleurCanvas kc;
    RGBInvoerPaneel rgbip;
    HSBInvoerPaneel hsbip;

    public void init()
    {   // NB: mwt klassieke awt, niet met behulp van Swing-componenten.
        setLayout(new BorderLayout());
        new Kleur(k);
        kc = new KleurCanvas();
        add(kc, "Center");
        k.addObserver(kc);
        rgbip = new RGBInvoerPaneel(k);
        k.addObserver(rgbip);
        add(rgbip, "East");
        hsbip = new HSBInvoerPaneel(k);
        k.addObserver(hsbip);
        add(hsbip, "West");
        setSize(600,340);
        setVisible(true);
    }
}
   


KleurCanvas bevat dus de paincomponent...

Kleur.java :
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
44
45
46
47
package kleurapplet;

import java.awt.Color;
import java.awt.Font;
import java.util.Observable;
import kleurapplet.grnuminput.NumberListener;

public class Kleur extends Observable implements NumberListener{

    private int roodval;
    private int groenval;
    private int blauwval;
    private float[] hsbvalues;

    // Constants
    private static Color echtRood = new Color(255, 0, 0);
    private static Color echtGroen = new Color(0, 255, 0);
    private static Color echtBlauw = new Color(0, 0, 255);
    private static Font displayfont = new Font("SansSerif", Font.PLAIN, 12);
    
    // Panels
    RGBInvoerPaneel rgbip;
    HSBInvoerPaneel hsbip;
    
    public Kleur(Kleur k)
    {   roodval = 127;
        groenval = 127;
        blauwval = 127;
        hsbvalues = Color.RGBtoHSB(roodval, groenval, blauwval, hsbvalues);
//      setBackground(Color.white);
//      setSize(360, 340);
    }

/**
 * Vertaalt een RGB-component in een tweecijferige hexamdecimale waarde.
 */
    public String hexValue(int c)
    {   String h = Integer.toHexString(c);
        if ( h.length() == 1 )          // add zero voor eencijferige string
        {   h = "0".concat(h);
        }
        return h;
    }
    
    public int getRoodval(){
        return roodval;
    }


En werkt nog steeds niet. Wat doe ik verkeerd?

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 12-02 09:57
StonedKinG schreef op donderdag 21 september 2006 @ 15:27:
[...]
En werkt nog steeds niet. Wat doe ik verkeerd?
Te veel ...

dit bv:
code:
1
public Kleur(Kleur k)

een public constructor waarbij je een instantie van hetzelfde type meegeeft? Wat is daar de bedoeling van?
code:
1
new Kleur(k);

Je maakt een nieuwe instantie aan (met bovenstaand probleem) en die ken je niet aan een variabele toe. Tevens geef je "k" die een null referentie heeft. Dit lijkt er meer op:
code:
1
k = new Kleur();


En je KleurCanvas moet gebruik gaan maken van die variabele "k" maar je geeft die nergens door aan KleurCanvas?

Er zitten gewoon té veel elementaire fouten in je code. Als je niet weet hoe je met variabelen moet werken, best misschien even daarop oefenen en dan verder gaan met deze opdracht want ik denk niet dat het de bedoeling is dat wij die voor jou gaan oplossen :)

Verwijderd

Offtopic: Naar alle waarschijnlijkheid doe jij het semester DDOA op het HAN ? :)

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
Hm daar is wat misgegaan met copy paste zie ik. (Zo is de code wel heel ranzig :') k = new Kleur(); had ik idd al, maar ook al geef ik k door aan Kleurcanvas (public KleurCanvas(Kleur k) ) dan nog pakt de paint methode hem niet.

Kleur:
Java:
1
2
k = new Kleur();
kc = new KleurCanvas(k);


Kleurapplet:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public KleurCanvas(Kleur k)
    {   //roodval = 127;
        //groenval = 127;
        //blauwval = 127;
        //hsbvalues = Color.RGBtoHSB(roodval, groenval, blauwval, hsbvalues);
        setBackground(Color.white);
        setSize(360, 340);
        
        
    }
...

blaat 

public void paint(Graphics g) 
    {   //Kleur k = new Kleur();
        g.setFont(displayfont);
        Color c;


en jah, HAN DDOA, wat me tot nu toe goed af gaat'... treads enzo al af :D

[ Voor 42% gewijzigd door Wijnbo op 21-09-2006 15:53 ]


Verwijderd

Haha dacht ik al :) Ik was de eerste projectleider bij de inleiding van het DDOA semester ( vorige halfjaar ) . Mijn team heeft toen het project gewonnen met een indoor route coach (tomtom binnen) . Doe Jos de groeten van Michel. Btw, kan je de code zo sturen ( + alle opdrachten die je moet maken ) .. eerst rijles nu.

  • DaRKie
  • Registratie: December 2001
  • Laatst online: 12-02 09:57
are, nog 1 keertje helpen:

code:
1
2
3
4
5
6
7
8
9
10
public KleurCanvas(Kleur k) 
    {    //roodval = 127; 
        //groenval = 127; 
        //blauwval = 127; 
        //hsbvalues = Color.RGBtoHSB(roodval, groenval, blauwval, hsbvalues); 
        setBackground(Color.white); 
        setSize(360, 340); 
         
         
    }


je geeft een parameter mee, als de constructor gelopen heeft, is die "k" beschikbaar voor de garbage collector, in andere woorden: je kan die k enkel in je constructor gebruiken.

Oplossing: ken die parameter toe aan een instantie variabele

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 13-02 20:06

Gerco

Professional Newbie

StonedKinG schreef op donderdag 21 september 2006 @ 15:47:
en jah, HAN DDOA, wat me tot nu toe goed af gaat'... treads enzo al af :D
Ik krijg sterk de indruk dat dit je meer gaat helpen dan dat wij je probleem stapsgewijs gaan oplossen. Je opdracht is dan weliswaar af, maar je hebt geen idee waarom het werkt. Het lijkt me ook zeer sterk dat je "threads" begrijpt, ook al heb je het 'af'.

Nofi hoor, maar je hebt echt een paar basislessen programmeren (in Java) nodig aan je code en vragen te zien.

[ Voor 6% gewijzigd door Gerco op 21-09-2006 15:57 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Appesteijn
  • Registratie: Juni 2001
  • Niet online
Ik weet niet op welke opleiding je zit, maar hier: http://www.cs.uu.nl/docs/vakken/imp staat onder het kopje Literatuur een erg goed (en downloadbaar) diktaat.

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
Gerco schreef op donderdag 21 september 2006 @ 15:57:
[...]

Ik krijg sterk de indruk dat dit je meer gaat helpen dan dat wij je probleem stapsgewijs gaan oplossen. Je opdracht is dan weliswaar af, maar je hebt geen idee waarom het werkt. Het lijkt me ook zeer sterk dat je "threads" begrijpt, ook al heb je het 'af'.

Nofi hoor, maar je hebt echt een paar basislessen programmeren (in Java) nodig aan je code en vragen te zien.
Nou, ik snap echt wel het naast elkaar lopen van treads ipv het opvolgen achter elkaar van instructies.
Oplossing: ken die parameter toe aan een instantie variabele
Hoe los ik dit nu het makkelijkste op?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 13-02 20:06

Gerco

Professional Newbie

StonedKinG schreef op donderdag 21 september 2006 @ 16:02:
Nou, ik snap echt wel het naast elkaar lopen van treads ipv het opvolgen achter elkaar van instructies.
En daar ga je al de mist in op een single processor systeem. De threads worden daar afgewisseld in timeslices waardoor het lijkt alsof de code gelijktijdig loopt. Dat is echter niet zo en het is heel belangrijk om jezelf in je code daartegen in te dekken.
Hoe los ik dit nu het makkelijkste op?
Je weet blijkbaar niet wat een instance variable is. Als je dat niet weet is het volkomen onmogelijk dat je thread-safe programmeren begrijpt aangezien dat voor een groot deel draait om het beschermen van voorgenoemde instance variabelen.

Ik probeer je niet af te branden, maar je alleen te laten inzien dat je er op deze manier niets mee opschiet. Het doel van je opdracht is waarschijnlijk om je te leren programmeren, hier leer je niets van.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
Gerco schreef op donderdag 21 september 2006 @ 16:13:
[...]

En daar ga je al de mist in op een single processor systeem. De threads worden daar afgewisseld in timeslices waardoor het lijkt alsof de code gelijktijdig loopt. Dat is echter niet zo en het is heel belangrijk om jezelf in je code daartegen in te dekken.


[...]

Je weet blijkbaar niet wat een instance variable is. Als je dat niet weet is het volkomen onmogelijk dat je thread-safe programmeren begrijpt aangezien dat voor een groot deel draait om het beschermen van voorgenoemde instance variabelen.

Ik probeer je niet af te branden, maar je alleen te laten inzien dat je er op deze manier niets mee opschiet. Het doel van je opdracht is waarschijnlijk om je te leren programmeren, hier leer je niets van.
Ik was er al achter dat mijn kennis op een paar punten nogal te kort schiet, vooral omdat ik nog geen tot weinig ervaring heb op het gebied van OO-programmeren. Ik zal het opvatten als positieve kritiek en me wat beter inlezen :) Iedereen bedankt voor de voor mij nuttige links alvast!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 13-02 20:06

Gerco

Professional Newbie

StonedKinG schreef op donderdag 21 september 2006 @ 16:22:
Ik was er al achter dat mijn kennis op een paar punten nogal te kort schiet, vooral omdat ik nog geen tot weinig ervaring heb op het gebied van OO-programmeren. Ik zal het opvatten als positieve kritiek en me wat beter inlezen :)
Het was ook positief bedoeld dus dat is fijn :) Die Java 101 link is wat gedateerd (JDK 1.1 geloof ik), maar de basis van Java is hetzelfde gebleven. Dingen als classes, objecten, constructors en variabelen zijn gewoon kennis die je echt nodig hebt om object georiënteerd te kunnen programmeren.

Er zijn vast betere tutorials, maar ik denk dat je je probleem zelf al zou kunnen oplossen als je Java 101 etc doorgelezen hebt.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 09-02 12:57

Wijnbo

Electronica werkt op rook.

Topicstarter
Gerco schreef op donderdag 21 september 2006 @ 16:34:
[...]

Het was ook positief bedoeld dus dat is fijn :) Die Java 101 link is wat gedateerd (JDK 1.1 geloof ik), maar de basis van Java is hetzelfde gebleven. Dingen als classes, objecten, constructors en variabelen zijn gewoon kennis die je echt nodig hebt om object georiënteerd te kunnen programmeren.

Er zijn vast betere tutorials, maar ik denk dat je je probleem zelf al zou kunnen oplossen als je Java 101 etc doorgelezen hebt.
Hey ik ben eruit!

Ik maak nu een Kleur tmp bovenaan de Kleurcanvas, vervolgens vul ik die met een tijdelijke waarde die ik meegeef via public KleurCanvas(Kleur k) om een nullpointer te voorkomendaar het eerder gepaint wordt dan er een update plaatsvind...

Daarna bij de update [code=java]Kleur tmp = (Kleur)obs;
repaint();[/codé]

en klaar!

/me begint enthousiast te raken over JAVA & OO maar heeft nog een boel te leren... maar het zit nu in 1 klap een stuk logischer in elkaar... bedank :D

[ Voor 4% gewijzigd door Wijnbo op 21-09-2006 18:58 ]

Pagina: 1