Scopo
Spesso
e volentieri mi e' capitato di dover rendere configurabile un prodotto.
Una serie di impostazioni iniziali (dimensioni e posizione delle finestre,
colori, stringhe varie, etc.) vanno rese modificabili dall'utente. Chiaramente
non vorrete dargli il sorgente... (anche se puo' decompilare il bytecode
:-) Per cui e' meglio prevedere un qualche tipo di file di configurazione
accessibile e umanamente leggibile.
La
classe Properties e' fatta a tal scopo. Specializza una Hashtable e fornisce
la possibilita' di inizializzarsi da un file su disco. Implementa di fatto
una tabella di stringhe, a cui si accede tramite chiave, customizzata per
la rappresentazione in memoria di un ".ini" file.
Uso
Se
guardate in fondo a questo articoletto, trovate un esempio di file ".ini"
gia' scritto, dovete solo salvarlo su un file ("config.ini"), compilare
il sorgente (sempre in fondo) e lanciare "java UseConfig". Otterrete una
finestrella tipo questa:
Prima
Se ora
provate a cambiare qualche valore nel file "config.ini" (che deve trovarsi
nella stessa directory) otterrete una variazione dell'aspetto a runtime
(mi raccomando: NON dovete ricompilare il codice java, lo scopo e' infatti
quello di poter leggere valori nuovi a runtime SENZA dover toccare il codice):
Sorgenti -
Il gestore
import java.util.*;
import java.io.*;
/**
Una classe usata
staticamente per gestire un file
di configurazione
unico per una singola applicazione.
E' abstract
in modo da non poter essere istanziata.
@author Andrea
Trentini
*/
public abstract class
Config
{
protected
static Properties cfg;
/**
Questo
metodo ritorna una stringa col valore corrispondente
alla
chiave fornita.
*/
public
static String getProp(String prop)
{
if(cfg==null)
{
cfg=new Properties();
try{
cfg.load(new FileInputStream("config.ini"));
}catch(Exception e)
{e.printStackTrace();}
}
// questa decidete voi se metterla o meno...
if(cfg.getProperty(prop)==null)
throw new RuntimeException(prop+": manca voce di configurazione!!!");
return cfg.getProperty(prop);
}
/**
Questo
metodo ritorna invece un intero, sperando
che
la stringa trovata rappresentasse davvero un intero :-)
*/
public
static int getInt(String prop)
{
return Integer.parseInt(getProp(prop));
}
}
Sorgenti - Il
main di prova
import
java.awt.*;
public
class UseConfig
{
public static void main(String[] arg)
{
Frame f=new Frame(Config.getProp("MAIN_TITLE"));
Label l=new Label(Config.getProp("MAIN_STRING"),Label.CENTER);
f.add(l);
f.setBounds(
Config.getInt("MAIN_X"),
Config.getInt("MAIN_Y"),
Config.getInt("MAIN_W"),
Config.getInt("MAIN_H")
);
f.setVisible(true);
}
}
Un
esempio di file di configurazione
(va
nominato "config.ini" a meno di non cambiare il sorgente)
# commento, viene ignorato
# un esempio di file
di configurazione
# dimensione e posizione
iniziale della finestra principale
# in pixel
MAIN_X=100
MAIN_Y=100
MAIN_W=350
MAIN_H=70
# testo da far apparire
nella finestra
MAIN_STRING=Ciao a tutti
i lettori di MOKABYTE !
# titolo della finestra
MAIN_TITLE=Esempio di
gestione di file di configurazione...
|