Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Aggiornare GUI, in particolare JTable

    Ciao a tutti, ho un problema con la mia GUI.

    Voglio che si aggiorni dopo le modifiche che effettuo. Non so bene come fare. Ho letto qualcosina ma non saprei metterla in pratica .

    Ho una classe che estende AbstractTableModel e gli passo una query al dbms. Questa classe AbstractTableModel la inserisco in una JTable per creare la tabella.
    Come la posso aggiornare?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da vegetablu Visualizza il messaggio
    Voglio che si aggiorni dopo le modifiche che effettuo. Non so bene come fare. Ho letto qualcosina ma non saprei metterla in pratica .

    Ho una classe che estende AbstractTableModel e gli passo una query al dbms. Questa classe AbstractTableModel la inserisco in una JTable per creare la tabella.
    Come la posso aggiornare?
    Dovresti precisare un po' meglio .. perché non è affatto chiaro. Con "gli passo una query al dbms" cosa intendi? Passi la istruzione SQL ed è il table model che esegue materialmente la query ... o la query la esegui altrove e al table model passi solo i risultati della query e basta?
    Mostra magari anche dei pezzi di codice, non abbiamo (io o altri) la sfera di cristallo.


    P.S. se hai letto "qualcosa" sui table model, dovresti aver visto che è il table model che mantiene i dati (generalmente ha una sua propria struttura dati interna ma non necessariamente è sempre così) e poi notifica la "view" affinché si aggiorni.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto ora è chiaro che è il table model che riceve una istruzione SQL, la esegue ed espone i dati/informazioni in base a ciò che ResultSet/ResultSetMetaData a loro volta espongono.

    Riguardo la editabilità o no delle celle, questa è controllata dal isCellEditable, che non hai ridefinito, quindi rimane quello ereditato da AbstractTableModel che restituisce fisso un false (quindi nessuna cella è editabile).
    Una volta che hai fatto in modo da rendere alcune celle editabili, poi ci sono da gestire gli aggiornamenti. Quando l'utente conferma l'input in una cella, viene invocato il setValueAt, che anche qui non hai ridefinito. Il punto è: cosa fare? Il ResultSet è read-only. Quindi o fai query di update oppure sfrutti i recordset "scrollable" E "updatable".

    Ma in ogni caso, a parte queste valutazioni, nel tuo codice ci sono svariate cose che non vanno: crei una nuova connection per ogni table model. Nelle applicazioni desktop GUI questo forse è "troppo" (ne basterebbe una sola, se gestita bene e correttamente).
    Poi fai Class.forName nel costruttore, idem superfluo farlo più volte se hai più tabelle.
    Inoltre nei vari metodi lanci IllegalStateException. Innanzitutto essendo "unchecked" non c'è bisogno di dichiararla con il throws.
    Ma a parte questo, i vari getColumnClass, getColumnCount NON li invochi tu ma tipicamente è il framework Swing che li invoca e non sai bene dove/quando. Quindi lanciare una eccezione solo perché lo stato non è quello giusto, non mi pare una buona idea. Meglio fornire un "default". Se getColumnCount() restituisce 0, il framework poi non invoca nemmeno getColumnClass/getColumnName.

    Diciamo, per concludere, che per fare la cosa davvero bene, riutilizzabile magari per diverse tabelle nella tua applicazione, ci sarebbe da fare un bel lavoro a livello di "design delle classi". E serve padronanza di ereditarietà, polimorfismo e magari anche dei Design pattern.
    Capisco.
    Molte cose le ho prese dal libro Programmazione Java Deitel, settima edizione.
    Diciamo che le ho copiate ed adattate.

    Mi potresti aiutare anzitutto con l'aggiornamento? Come e cosa devo richiamare per far aggiornare la GUI?
    Magari dopo vediamo pure il discorso delle celle editabili.

    Grazie

  4. #4
    Come faccio ad aggiornare la GUI quindi? Magari tramite un metodo o non saprei.
    Grazie

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da vegetablu Visualizza il messaggio
    Come faccio ad aggiornare la GUI quindi?
    Intendi come aggiornare la tabella quando il table model viene aggiornato in qualche modo? Detto in generale, quando il table model cambia il suo stato interno, deve notificare la view inviando un TableModelEvent ai TableModelListener registrati (e JTable è implicitamente uno di questi "ascoltatori").
    AbstractTableModel espone una serie di metodi fireXXX che semplificano la notifica di varie tipologie di cambiamenti (es. "una o più righe sono state aggiornate"). Questa in sostanza è la risposta generale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Intendi come aggiornare la tabella quando il table model viene aggiornato in qualche modo? Detto in generale, quando il table model cambia il suo stato interno, deve notificare la view inviando un TableModelEvent ai TableModelListener registrati (e JTable è implicitamente uno di questi "ascoltatori").
    AbstractTableModel espone una serie di metodi fireXXX che semplificano la notifica di varie tipologie di cambiamenti (es. "una o più righe sono state aggiornate"). Questa in sostanza è la risposta generale.
    Il problema è che non ho capito come metterlo in pratica. Ad esempio io vorrei che ad ogni aggiornamento o scroll mi si aggiorna. Come posso farlo?

    Grazie

  7. #7
    Mi potete aiutare?
    Grazie anticipatamente.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da vegetablu Visualizza il messaggio
    Mi potete aiutare?
    Se intendi il fatto che l'utente debba scrivere nelle celle (quelle editabili, ovviamente) e possa aggiornare i dati sulla tabella, la questione è (più) complicata.

    Innanzitutto il tuo table model (quello postato prima) non ha una sua struttura dati. Infatti usa direttamente un ResultSet "scrollabile" e può quindi puntare con il absolute() alla tal riga e prendere la tal colonna. Insomma, tutto fatto "al volo" sul ResultSet.
    Se vuoi mantenere questa cosa, la prima cosa che puoi pensare di utilizzare è un ResultSet che sia anche "updatable". Non devi più usare ResultSet.CONCUR_READ_ONLY ma l'altro flag (vedi javadoc).

    Serve però poi altro. Sicuramente implementare il setValueAt per fare le seguenti cose: di nuovo il absolute() per andare alla tal riga, poi utilizzerai uno degli updateXYZ() di ResultSet e poi infine il updateRow() sempre di ResultSet per far scrivere su db.
    Grosso modo .... (non sono cose che uso tutti i giorni). Informazioni più precise come al solito le trovi sulla documentazione javadoc e sul tutorial Oracle ufficiale (c'è una sezione su JDBC).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.