Newsgroup: it.comp.java
Titolo: ComboBoxModel - problema di visualizzazione

Salve a tutti,
Mi sono trovato davanti ad un curioso inghippo mentre svolgevo un
progetto per l'universita'...
In particolare, il progetto riguardava la gestione di conti correnti
bancari; per questo motivo, quindi, ho predisposto una classe
"CurrentAccountRegister" per modellare il registro dei conti: in
pratica un container di conti correnti.
Sviluppando l'interfaccia SWING dell'applicazione, volevo far si' che
l'utente possa scegliere il conto corrente sul quale operare da una
combo box, per cui ho creato una classe adapter, ComboModelRegister,
che wrappa un CurrentAccountRegister in modo da farlo divenire un
modello di combo box.
Preciso che ogni invocazione di metodo effettuata sul
ComboModelRegister viene delegata al registro: non esiste alcuna forma
di bufferizzazione o di pooling nel model.
Come variabile di istanza della classe pricipale (quella col main, per
intenderci) ho un CurrentAccountRegister, che all'interno del
costruttore viene adattato a ComboModelRegister e collegato ad una
combobox, accountNumbers.
Tutte le operazioni possibili sui conti correnti aderiscono al pattern
Command e derivano da una classe astratta chiamata VisualOperation,
che porta un metodo:
CurrentAccountRegister doOperation(CurrentAccountRegister).
che e' quello richiamato dall'applicazione per effettuare
l'operazione.  Il codice che effettua la chiamata e' il seguente:
// currOp e' l'operazione da eseguire
if (currOp != null) {
   CurrentAccount account = (CurrentAccount)accountNumbers.getSelectedItem();
   // imposto l'operazione per lavorare su questo conto corrente
   currOp.operateOnAccount(account);
   register = currOp.doOperation(register);
 
   // questa e' la riga sospetta
   ((ComboModelRegister)accountNumbers.getModel()).setRegister(register);
   accountNumbers.setSelectedItem(register.getCurrentAccount(
                                         (account == null)
                                         ? -1
                                         : account.getAccountID()));
Tutto funziona alla perfezione, tranne che *a volte*, in maniera
completamente casuale, quando faccio l'operazione di creazione nuovo
conto corrente e clicco sulla combobox dei conti, il pop-up mi appare
vuoto e, cliccandoci dentro, viene selezionato il nuovo account.
se cambio la riga "sospetta" con
accountNumbers.setModel(new ComboModelRegister(register));
il problema sparisce... Ma non posso creare un nuovo oggetto ogni
volta che viene fatta un'operazione!!! Garbage Collection a
tremila!!!!
Inoltre, l'altro motivo per il quale sono cosi' perplesso e' che
l'operazione di creazione account (l'unica "incriminata"), in realta'
si riduce a qualche controllo di correttezza e ad un inserimento in
una hash map... Quindi non invalida in alcun modo il riferimento al
registro usato da tutta l'applicazione...
C'e' qualcuno che mi sa dare una spiegazione razionale per questo
strano comportamento?
Grazie in anticipo!!!
-- 
__/\__ * this mail has been written by Talpa Stellare
\ TS / * che da piccolo una volta e' morto.
 |/\|  * icq# 78630739 - togli i caratteri maiuscoli x e-mail


Stai usando il JDK 1.4? Nel JDK 1.3 c'e' un bel bug sul ComboBoxModel che causa un
malfunzionamento simile a quello che lamenti tu, ovvero la vista non seleziona l'elemento
attualmente selezionato nel modello ma semplicemente il primo.
Se fosse quello, o passi al JDK 1.4 oppure introduci una classe che estendi JComboBox
nella quale ridefinisci il comportamento bacato della setModel().
Ciao,
    Bruno.
---
| Bruno Bossola 
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola
|
| Membro del JUG Torino - 
http://www.jugtorino.it
| 

 attualmente selezionato nel modello ma semplicemente il primo.
Ti ringrazio per la risposta... sulla base del tuo suggerimento sono
riuscito a scovare il bug (numero 4139671). Io uso il jdk 1.4.1-b21,
ma visto che il bug che mi si presenta mi sembra proprio quello
descritto, ne deduco che invece e' ancora aperto. Sai che versione di
Swing e' inclusa in jdk1.4.1?



Uhm... direi di no :-)
Sorry ma sono entrato in un periodo non operativo, sono a casa in
malattia.
Ciao,
    Bruno.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG