Newsgroup: it.comp.java
Titolo: Un discorso di procedura

I miei sono passi piccoli e per me il mondo java è nuovo di zecca, la 
OOP è per me qualcosa di nuovo! Per questo chiedo indicazioni sul modo 
di comportarsi a livello di procedura. Dunque attraverso la GUI creo la 
mia bella interfaccia sul form.... ma di questi oggetti, poi, a livello 
di codice devo creare delle istanze diverse? Se è così, non è corretto 
nel codice riferirsi in modo diretto all'oggetto presente nel form?
 
-- 
Gulp®
(forse mi sono perso qualcosa :))

 ha scritto:

http://www.matteobellucci.it/files/java/manuale_pratico_di_programmazione_java.pdf
 
 
Vedi i capp. 9 e 10
 
 


Ogni riferimento e' valido, basta essere consapevoli di cio' che si fa'.
 
Ad esempio, sia:
 
Object cella = getModel().getVatueAt(row, col);
 
l'istanza di una cella della tua tabella, ora poniamo che la riga a cui 
apparteneva la cella venga cancellata. Il riferimento alle altre celle 
della stessa riga e' irraggiungibile, e probabilmente il garbage 
collector ha anche liberato la memoria relativa, ma l'istanza della tua 
cella e' ancora presente nella tua classe ed e' un oggetto tuttora 
valido, semplicemente, coservandone un riferimento, il garbage collector 
non lo distrugge.
In questo caso l'uso dell'istanza  e' improprio, si sarebbe dovuto 
utilizzare un WeakReference testando se l'oggetto esiste ancora:
 
WeakReference cellaRef =
	new WeakReference(getModel().getVatueAt(row, col));
 
...
if (cella.get() != null)
   ...
 

Mi riferivo, ad esempio, a questo:
 
GridClienti.getColumn("COGNOME").setPreferredWidth(150);
GridClienti.getColumn("NOME").setPreferredWidth(160);
GridClienti.getColumn("INDIRIZZO").setPreferredWidth(200);
 
o meglio, a questo:
 
GridClienti.setModel(DbUtils.resultSetToTableModel(rs));
 
Dove GridClienti è effettivamente una JTable presente sul form.
Per funzionare funziona.
Ma è corretto?


Grazie. Strumento utile.


E per far riferimento ad un nostro altro 3d:
 
JTable table = new JTable();
ListSelectionModel selectionModel= table.getListSelectionModel();
 
La prima riga mi serve se ho già GridClienti? E la seconda può allora 
diventare:
 
ListSelectionModel selectionModel= GridClienti.getListSelectionModel();



Ovviamente si'. Il mio era solo un esempio tanto per esplicitare che il 
membro table era di tipo JTable.

 Ma è corretto?
Certo che e' corretto, a parte la nomenclatura: gridClienti sarebbe 
preferibile; GridClienti.setModel, a colpo d'occhio, sembrerebbe una 
chiamata al metodo statico setModel della classe GridClienti.
E' corretto perche' la tua classe ha istanziato la JTable, quindi ne ha 
piena responsabilita'. Il mio discorso si riferiva piu' che altro a 
mantenere il riferimento ad oggetti di cui non hai il controllo, come 
variabili di classe e non variabili locali in un metodo.
 
P.S. Ti segnalo anche TableColumnModel da utilizzare o nel costruttore 
di JTable o tramite il metodo setColumnModel. Un TableColumnModel ha la 
responsabilita' di definire le colonne, e relative proprietà, della tua 
tabella. In tal senso potresti costruire il TableColumnModel in base al 
resultSet.getMetadata, lasciando alla JTable, la view, la 
responsabilita' di modificare dinamicamente l'ampiezza delle colonne in 
base alle dimensioni della window che la contiene, quindi in modo 
automatico.