[Java] Kan object niet vinden.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BasNation
  • Registratie: Mei 2004
  • Laatst online: 18-09 16:25
Ben sinds enkele dagen met Java bezig, maar kan er nog niet heel veel van. Het programma zal nogal wat groter worden dus heb GUI gescheiden van de control klassen. Ik kan alleen niet masterControl methoden aanroepen vanuit de masterGUI. Ik krijg een error.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package cpco;

public class Main {

    public static void main(String args[]) {
        startControl();
        startGUI();
    }

    public final static void startControl() {
        MasterControl masterControl = new MasterControl();
    }

    public final static void startGUI() {
        MasterGUI masterGUI = new MasterGUI();
        masterGUI.setVisible(true);
    }
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package cpco;

import java.sql.*;

public class MasterControl {

    public MasterControl() {
        // lege constructor
    }

    public void getWorkshops() {
        // de methode die ik vanuit de GUI aan wil roepen.
    }
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package cpco;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class MasterGUI extends JFrame {

    public MasterGUI() {
        final JFrame frame = new JFrame();
        getContentPane().add("Workshops", frame);

        // hier wat ik wil doen:
        masterControl.getWorkshops();
    }
}


code:
1
2
3
4
Exception in thread "AWT-EventQueue-0" java.lang.Error:
Unresolved compilation problem: masterControl cannot be resolved

    at cpco.MasterGUI.<init>(MasterGUI.java:11)


Het is ongetwijfeld ongelofelijk simpel, maar ik zit er nu al uren mee te rommelen en krijg het niet werkend :?

[ Voor 5% gewijzigd door BasNation op 02-03-2009 00:54 ]


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

De error zegt eigenlijk al wat er mis is: masterControl cannot be resolved at cpco.MasterGUI.<init>(MasterGUI.java:11)
In de functie MasterGUI() is de variabele masterControl helemaal niet bekend.

In de functie startControl() zie ik dat je hem definieert, en er een instantie van MasterControl in stopt.
Binnen deze scope (in dit geval, alleen die functie) is de variabele masterControl bekend.
Maar als die functie eindigt, zal java die variabele weer netjes opruimen.

Wat je moet doen is die variabele ergens definiëren waar hij beschikbaar is op de plaats waar jij hem nodig hebt, bv zo:
Java:
1
2
3
4
5
6
7
8
    public MasterGUI() {
        final JFrame frame = new JFrame();
        getContentPane().add("Workshops", frame);

        MasterControl masterControl = new MasterControl(); 
        // hier wat ik wil doen:
        masterControl.getWorkshops();
    }


Dit is één antwoord, niet hét antwoord. Waarschijnlijk is dit zelfs niet de oplossing die je eigenlijk zoekt, maar het helpt je wel van je huidige probleem af.
Hopelijk heb ik je hiermee een zet in de juiste richting gegeven en begrijp je nou waarom java de variabele niet kon vinden.

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • BasNation
  • Registratie: Mei 2004
  • Laatst online: 18-09 16:25
Wat je moet doen is die variabele ergens definiëren waar hij beschikbaar is op de plaats waar jij hem nodig hebt.
Dat snap ik, maar ik had gehoopt dat er een manier was om masterControl vanuit alle andere klassen te benaderen. Er gaan namelijk een boel klassen komen die gebruik gaan maken van de methoden in de MasterControl klasse.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Je kan de MasterControl instantie vanuit je main() meegeven aan elk ander object dat hem nodig heeft (via de constructor of een set-methode). Een andere optie is MasterControl een static getInstance() method te geven.

Pas wel op voor het God-object anti-pattern.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • BasNation
  • Registratie: Mei 2004
  • Laatst online: 18-09 16:25
Herko_ter_Horst schreef op maandag 02 maart 2009 @ 09:32:
Je kan de MasterControl instantie vanuit je main() meegeven aan elk ander object dat hem nodig heeft (via de constructor of een set-methode). Een andere optie is MasterControl een static getInstance() method te geven.

Pas wel op voor het God-object anti-pattern.
Dus wat ik eigenlijk zou moeten doen is bij ieder GUI object een nieuwe masterControl laten aanmaken die dan alleen vanuit die specifieke GUI klasse te benaderen is. Blijkt maar weer dat ik het OO verhaal nog niet 100% door heb hehe.

Acties:
  • 0 Henk 'm!

  • hellfighter87
  • Registratie: Mei 2008
  • Laatst online: 16:47
BasNation schreef op maandag 02 maart 2009 @ 09:44:
[...]

Dus wat ik eigenlijk zou moeten doen is bij ieder GUI object een nieuwe masterControl laten aanmaken die dan alleen vanuit die specifieke GUI klasse te benaderen is. Blijkt maar weer dat ik het OO verhaal nog niet 100% door heb hehe.
Nee niet een nieuw object :o gewoon het huidige object meegeven aan de volgende klasse via een parameter in de constructor.
Of als je maar een zoon classe nodig hebt kan je hem altijd statisch maken :P.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Inderdaad: één instantie aanmaken in de main() en die doorgeven, of één instantie statisch aanmaken in MasterControl en die via een statische getInstance() method beschikbaar maken voor "iedereen".

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Herko_ter_Horst schreef op maandag 02 maart 2009 @ 09:53:
Inderdaad: één instantie aanmaken in de main() en die doorgeven, of één instantie statisch aanmaken in MasterControl en die via een statische getInstance() method beschikbaar maken voor "iedereen".
(zoekterm voor TS: Singleton)

Verdiep je verder ook eens in het MVC gebeuren alvorens je hele applicatie op te zetten.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Acties:
  • 0 Henk 'm!

  • BasNation
  • Registratie: Mei 2004
  • Laatst online: 18-09 16:25
Oke, bedankt voor alle input. Ben op zoek gegaan en heb het een en ander werkend gekregen. Zoals het er nu uit ziet:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package cpco;

public class Main {

    public static void main(String args[]) {
        startControl();
        startGUI();
    }

    public final static void startControl() {
        MasterControl masterControl = new MasterControl();
    }

    public final static void startGUI() {
        MasterGUI masterGUI = new MasterGUI();
        masterGUI.setVisible(true);
    }
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package cpco;

import java.sql.*;

public class MasterControl {

    private static MasterControl instance = null;

    protected MasterControl() {
        // Exists only to defeat instantiation.
    }

    public static MasterControl getInstance(){
        if(instance == null) {
                instance = new MasterControl();
        }
        return instance;
    }

    public void getWorkshops() {
        // de methode die ik vanuit de GUI aan wil roepen.
    }
}


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package cpco;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class MasterGUI extends JFrame {

    private MasterControl masterControl = MasterControl.getInstance();

    public MasterGUI() {
        final JFrame frame = new JFrame();
        getContentPane().add("Workshops", frame);

        // hier wat ik wil doen:
        masterControl.getWorkshops();
    }
}

Acties:
  • 0 Henk 'm!

Verwijderd

Mij lijkt het in dit geval netter om de mastercontrol instantie mee te geven aan je GUI.
Een singleton gebruik je niet als ingang voor je GUI.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Pas nog even op: je maakt nu twee MasterControls: één in je Main en één als static. Ik zou die constructor private maken. En heeft die uitgestelde instantiatie zin? Zo niet: niet doen, gewoon aanmaken in de declaratie.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • BasNation
  • Registratie: Mei 2004
  • Laatst online: 18-09 16:25
Herko_ter_Horst schreef op maandag 02 maart 2009 @ 10:49:
Pas nog even op: je maakt nu twee MasterControls: één in je Main en één als static.
Ik zie het, gefixed.
Herko_ter_Horst schreef op maandag 02 maart 2009 @ 10:49:
Ik zou die constructor private maken.
Ik heb mijn informatie hier gevonden en die gebruiken protected: http://www.javaworld.com/...esignpatterns.html?page=1
Herko_ter_Horst schreef op maandag 02 maart 2009 @ 10:49:
En heeft die uitgestelde instantiatie zin? Zo niet: niet doen, gewoon aanmaken in de declaratie.
Hier begrijp ik niks van ;)

Acties:
  • 0 Henk 'm!

Verwijderd

2 puntjes:

1. Je singleton implementatie MasterControl is onjuist. Bij een singleton wil je de constructor private hebben.
Dit voorkomt ook je onjuiste MasterControl masterControl = new MasterControl(); initiatie.

2. de MasterControl masterControl = new MasterControl(); initiatie doet niets.
Je slaat het object in de methode scope op. Zodra deze methode klaar is. wordt de masterControl weer verwijderd.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Zij gebruiken als "excuus" dat je die class zonder protected niet meer kan extenden. M.i. gaat dat in tegen het idee van een singleton i.c.m. het Liskov substitution principle. Sowieso is extenden in jouw usecase niet van toepassing.
[...]

Hier begrijp ik niks van ;)
Je hebt dat voorbeeld overgenomen zonder dat je het hoe en waarom helemaal doorhebt :) Je huidige code maakt de MasterControl instantie pas aan de eerste keer dat iemand de getInstance() methode aanroept. Dit is een bekende "truuk" om te voorkomen dat er allerlei "dure" objecten moeten worden aangemaakt bij het inladen van de classes. Er kleven echter ook nadelen aan, m.n. m.b.t. thread safety (zoekterm o.a.: double checked locking).

Dit is voor jou op dit moment allemaal nog niet van toepassing (noch de delayed instantiation, noch thread safety), dus ik zou het gewoon simpel houden en de instantie direct aanmaken:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package cpco;

import java.sql.*;

public class MasterControl {

    private static MasterControl instance = new MasterControl();

    private MasterControl() {
        // Exists only to defeat instantiation.
    }

    public static MasterControl getInstance(){
        return instance;
    }

    public void getWorkshops() {
        // de methode die ik vanuit de GUI aan wil roepen.
    }
}

"Any sufficiently advanced technology is indistinguishable from magic."

Pagina: 1