Toon posts:

[JAVA] Variabele uit andere klasse gebruiken

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

Verwijderd

Topicstarter
Hallo, ik ben bezig met het maken van een programma waarin ik onder andere ondersteuning voor meerdere talen heb toegevoegd.
Nu kom ik op het punt waarop ik graag wat meer Classes wil gaan maken omdat mijn hoofdklasse anders onleesbaar wordt. Ook in deze subclasses heb ik taalondersteuning nodig.

Ik regel het taal-verhaal met het volgende stukje code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            //Get language from preferences.properties file
            String path = "preferences.properties";
            try
            {
                InputStream is = new FileInputStream(path);
                props = new Properties();
                props.load(is);
                is.close();
            }
            catch(IOException ioe)
            {
                System.out.println("Error loading properties file");
            }
            //Set language in string language
            language = props.getProperty("Location");

            this.label = null;
            this.scrollPane = new JScrollPane(this.output);
            this.LangPack = ResourceBundle.getBundle(language);


Dit werkt allemaal prima. Wat ik nu graag zou doen is voor bovenstaand stukje code een aparte class maken die ik in al mijn andere files kan gebruiken, een beetje het HTML include idee.

Hier ben ik dus al twee dagen mee bezig maar ik kan maar niet uitvogelen hoe ik nu een class bouw en die in een andere class aanroep zodat ik ook de variabelen terug krijg. Ik kan mijn Language-class wel aanroepen met Language lang = new Language(); maar daarmee kan ik de variabelen die ik in Language maak (LangPack) nog niet gebruiken.

Zou iemand me even op het juiste spoor willen zetten want ik ben het een beetje kwijt. :/

Het zal waarschijnlijk wel vrij basic zijn maar misschien is dat nu juist waarom ik er nergens iets over kan vinden.

  • whoami
  • Registratie: December 2000
  • Nu online
Je kan toch een public method schrijven (een 'getter'), die de gewenste variabele voor jou gaat gaan teruggeven?

Daarnaast is het wel aan te raden dat je eens goed nadenkt over jouw classes:
- welke classes ga je maken
- hoe gaan de relaties zijn tussen die classes
- stelt iedere class een op zichzelf staand geheel voor ?
- etc...

https://fgheysels.github.io/


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Mbv een getter kan je op een nete manier info ophalen van 1 class in een andere.
code:
1
2
3
4
5
6
7
8
9
10
class Persoon{
   private String _naam;
   
   //constructor
   

    public String getNaam(){
        return _naam;
    }
}


[edit]
Als je merkt dat je alles met getters en setters loopt te voorzien, dan is het trouwens wel tijd om even goed stil te staan en jezelf af te vragen of je goed bezig bent.

[ Voor 31% gewijzigd door Alarmnummer op 04-12-2003 10:46 ]


  • jvo
  • Registratie: Augustus 2001
  • Laatst online: 04-10-2023

jvo

geen commentaar

Denk eens aan statische methoden en variabelen. Maak dus een klasse met een statische init() methode om zichzelf te initialiseren en de nodige informatie te laden en een statische vertaalmethode. Deze kan de aangeroepen worden als: VertaalKlasse.vertaal("deze tekst") o.i.d. De init() roep je gewoon een keer aan tijdens het opstarten.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

jvo schreef op 04 december 2003 @ 10:30:
Denk eens aan statische methoden en variabelen. Maak dus een klasse met een statische init() methode om zichzelf te initialiseren en de nodige informatie te laden en een statische vertaalmethode. Deze kan de aangeroepen worden als: VertaalKlasse.vertaal("deze tekst") o.i.d. De init() roep je gewoon een keer aan tijdens het opstarten.
Of een singleton.

Verwijderd

Topicstarter
Alarmnummer, als ik het goed begrijp heb je een Class met de String naam. In die string zet je iets.

Vervolgens maak je een method die de String naam terug geeft.

Maar hoe roep ik die Class/methode dan aan vanuit het bestand waarin ik die String nodig heb? Ik probeer iets als Localizer = new Localizer(getNaam()); maar dat mag niet.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op 04 december 2003 @ 11:30:
Alarmnummer, als ik het goed begrijp heb je een Class met de String naam. In die string zet je iets.

Vervolgens maak je een method die de String naam terug geeft.

Maar hoe roep ik die Class/methode dan aan vanuit het bestand waarin ik die String nodig heb?
Het gaat erom dat je dus een referentie krijgt naar dat object. Je zou het object mbv een constructor kunnen meegeven, of dmv een setter instellen. Of gewoon terplekke aanmaken.
Ik probeer iets als Localizer = new Localizer(getNaam()); maar dat mag niet.
Kan je iets meer code geven?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 18:25

momania

iPhone 30! Bam!

Taalondersteuning is dus niet iets om apart te trekken.
Je maakt per taal een resource bundeltje en in je code vraag je de default Locale op en haal je de bijbehorende recources op.

Om te werken met de Locales in JAVA hoef je die niet 1 keer op te halen en overal aan door te geven.
Die initaliseer je 1 keer en dan heb je ze overal ter beschikking.

Zoiets dus:
Java:
1
2
Locale locale = Locale.getDefault();
ResourceBundle bundle = PropertyResourceBundle.getBundle("filename", locale);

Wat je nog kan doen is de locale van te voren zelf instellen via:
Java:
1
Locale.setDefault(new Locale("en", "GB"));

Waarbij de 'en' de taal is, en 'GB' het land.
In geval van nederland is dat dus 'nl' en 'NL'

Via:
Java:
1
bundle.getString("key");

Haal je dan alle waardes op via de keys die je hebt.

Verder maak je altijd een default property file met de standaard taal en kan je per taal en/of land er 1 bij maken die in de zelfde directory moet staan en dan automatisch geladen wordt.

Je maakt dus bv een 'messages.properties' voor je standaard taal en voor en een engelse een 'messages_en.properties' of voor typisch een land engels versie bv 'messages_en_US.properties'

Ga je dus daar in eens verdiepen ;)

Maar als je nog niet goed weet dat je voor variabelen getters en setter moet/kan maken zou ik me eerst eens goed gaan verdiepen in het java programmeren zelf ;)

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


Verwijderd

Topicstarter
Jazeker, overigens, in reply op whoami, ik heb een hele ontwikkelmethode doorgelopen met class, sequence, collaboration en use-case diagrams en op papier werkt het allemaal mooi, het is alleen dat je in de praktijk soms vastloopt op iets heel stoms als dit. :)

De code; ik heb twee Classes, eentje Localizer, die straks de ResourceBundle gaat vullen, voor nu heb ik er alleen even een String in staan. En de tweede is PreferencesDialog, dat is een van de subklassen waarin ik straks gelokaliseerde variabelen wil gaan gebruiken.

Voor nu probeer ik alleen een naam van Localizer in PreferencesDialog te krijgen.

Localizer:
code:
1
2
3
4
5
6
7
8
9
10
public class Localizer {
    
    String naam = "janjaap";
    
            public String getNaam()
            {
                return naam;
            }
                
    }


PreferencesDialog
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
public class PreferencesDialog {
    
    //Declare variables
    public JTabbedPane preferencesTabbedPane;
    
    /** Creates a new instance of PreferencesDialog */
    public PreferencesDialog() {
       
       //Create JDialog and set its properties 
       JDialog preferences = new JDialog();
       preferences.setSize(400,350);       
       preferences.setModal(true);  
       
       //Create tabbed pane for the tabs containing preferences
       preferencesTabbedPane = new JTabbedPane(JTabbedPane.TOP);
       
    
       Localizer local = new Localizer(getNaam());
    
        
        
       
       //After building, show the dialog
       preferences.show();
    }
    

}


Zoals je ziet probeer ik de Localizer aan te roepen, maar daar gaat het dus fout, de compiler zegt:
code:
1
2
3
4
PreferencesDialog.java [22:1] cannot resolve symbol
symbol  : method getNaam ()
location: class PreferencesDialog
       Localizer local = new Localizer(getNaam());


Wat ik daaruit opmaak is dat hij dus denkt dat getNaam in PreferencesDialog zit, en dat is niet zo.

Verwijderd

Topicstarter
momania, been there, done that :)

Ik heb in mijn hoofdbestand een ResourceBundle die inderdaad de Locale uit een properties file haalt, werkt allemaal prima. Je kunt ze dus alleen niet in je subclasses aanroepen. Mijn ResourceBundle heet LangPack. Als ik die aanroep in een subclass dan krijg ik:

code:
1
2
3
4
PreferencesDialog.java [23:1] cannot resolve symbol
symbol  : variable LangPack 
location: class PreferencesDialog
       JButton buttonOK = new JButton(); buttonOK.setText(LangPack.getString("OK"));


Vandaar dus mijn vraag hoe ik variabelen op kan halen, ik wil graag LangPack ophalen.

Wat betreft het meer leren over Java, daar heb je helemaal gelijk in, maar als ik het allemaal wist dan vroeg ik het hier niet natuurlijk. In m'n openingspost vraag ik ook of iemand me op het juiste spoor kan zetten, niet om het kant- en klare antwoord. Een setter/getter tutorial is voor mij voldoende :)

  • momania
  • Registratie: Mei 2000
  • Laatst online: 18:25

momania

iPhone 30! Bam!

Verwijderd schreef op 04 december 2003 @ 11:50:

Wat ik daaruit opmaak is dat hij dus denkt dat getNaam in PreferencesDialog zit, en dat is niet zo.
ja, hèhè..
Als je direct getNaam() als parameter meegeeft aan je Localizer dan ga je er vanuit dat getNaam() onderdeel is van PreferencesDialog.

Dit is wat je wilt:
Java:
1
2
Localizer local = new Localizer();
String naam = local.getNaam();

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


  • momania
  • Registratie: Mei 2000
  • Laatst online: 18:25

momania

iPhone 30! Bam!

Verwijderd schreef op 04 december 2003 @ 11:58:
Vandaar dus mijn vraag hoe ik variabelen op kan halen, ik wil graag LangPack ophalen.
Wat ik dus probeerde uit te leggen is dat je dat niet moet willen via een eigen class waarin je je recource bundle vast houd, omdat je die ten aller tijden op kan halen via die 2 regels die ik eerder gaf.
Dat is de manier van werken met de resouce bundles.

In iedere class haal je dus je bundle op en vraag je de strings eruit die je nodig hebt.

Je kan dit wel zo willen, maar dan ben je op de verkeerde manier java aan het leren.

Als ik zie dat je een methode van een class probeerd aan te roepen door de methode naam als parameter in de contstructor mee te geven, dan denk ik dat je nog niet helemaal in de gaten hebt hoe je in java moet programmeren.

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


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:57

Robtimus

me Robtimus no like you

momania schreef op 04 december 2003 @ 11:59:
[...]

ja, hèhè..
Als je direct getNaam() als parameter meegeeft aan je Localizer dan ga je er vanuit dat getNaam() onderdeel is van PreferencesDialog.

Dit is wat je wilt:
Java:
1
2
Localizer local = new Localizer();
String naam = local.getNaam();
of als je die variabele alleen dit keer nodig hebt:
Java:
1
String naam = new Localizer().getNaam();

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1