Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42

    Modificare un oggetto attraverso l'editing di una jTable

    Salve a tutti,
    ho Una jTable Popolata attraverso l'elenco dei giocatori contenuti in un archivio.
    Come posso fare in modo che alla modifica della tabella, venga modificato L'oggetto a cui si riferisce?

    [EDIT]
    Chiedo scusa per la domanda un po' troppo generica… Magari potreste darmi qualche indicazione su del materiale da studiare
    Ultima modifica di MBdip; 14-06-2014 a 22:24

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Come posso fare in modo che alla modifica della tabella, venga modificato L'oggetto a cui si riferisce?
    Per "modifica della tabella" intendi l'utilizzo dell'edit delle celle che è possibile in JTable? Se sì, quando il valore in una cella viene confermato, esso va a finire al table model tramite setValueAt. Quindi innanzitutto si tratta di valutare quale table model stai usando o intendi usare.
    E comunque servono un po' di dettagli in più per comprendere bene e meglio la tua problematica.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Allora, la mia tabella è costruita attraverso questo metodo:

    codice:
    public void print_table(String elenco, javax.swing.JTable table){
                    DefaultTableModel model = new DefaultTableModel();
                    if (table != null) {
                        table.setModel(model);
                        
                        String[] rows = elenco.split(System.getProperty("line.separator"));
                        String[] intestaz = rows[0].split("\t");
                                           
                        for (int x = 0; x < intestaz.length; x++) {
                            model.addColumn(intestaz[x]);
                        }
                        
                        for (int x = 1; x < rows.length; x++) {
                            String[] row = rows[x].split("\t");
                            model.addRow(row);
                        }
                    }
    
    
        }
    L'elenco è praticamente una stringa, riporto il metodo utilizzato
    codice:
    public  String elenco_giocatori(){
                String S = "";
                S+=Giocatore.GetIntestazione()+ System.getProperty("line.separator");//Nome\tCognome
                for(int i = 1; i <= giocatori.size(); i++) {
                    S+=giocatori.get(i-1).get_all()+ System.getProperty("line.separator");//Mario\tRossi
                }
                return S;
        }
    Quindi in pratica una volta confermato il valore basterebbe andarlo a prendere in un table model... Ma questo penso che debba definirlo in un'eventuale listner Per poi utilizzare qualcosa del tipo model.getValueAt....
    Ma quale listner E quale model usare?
    Ultima modifica di MBdip; 15-06-2014 a 01:05

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    L'elenco è praticamente una stringa, riporto il metodo utilizzato
    codice:
    public  String elenco_giocatori(){
                String S = "";
                S+=Giocatore.GetIntestazione()+ System.getProperty("line.separator");//Nome\tCognome
                for(int i = 1; i <= giocatori.size(); i++) {
                    S+=giocatori.get(i-1).get_all()+ System.getProperty("line.separator");//Mario\tRossi
                }
                return S;
        }
    Partiamo da una questione un po' prima del table model. Se stai gestendo delle entità "giocatore", sarebbe bene avere una classe Giocatore che "modella" solamente le caratteristiche di un giocatore, senza alcuna altra logica particolare specifica della applicazione. In pratica, a livello basilare, una classe con i campi di istanza per i dati e i relativi metodi getter e/o setter più altri di utilità (es. toString(), equals(), .....).
    E sarebbe poi bene avere un array o List di oggetti Giocatore, quindi es. un Giocatore[] o un List<Giocatore> .

    Hai queste cose? Nel codice che hai postato, vedo una classe Giocatore ma ..... ho la vaga sensazione che non sia come la intendo io.
    Quindi innanzitutto verifica e valuta quanto ho appena detto. Perché metterti a fare concatenazioni di stringhe per avere una "stringona" con i newline in mezzo e poi fare split da altre parti non è affatto una buona soluzione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    hai perfettamente ragione!
    Siccome avevo già il metodo per stampare l'elenco in una enorme stringa (perché prima avevo implementato il programma per la visualizzazione attraverso console), ho sfruttato il metodo già esistente.
    Capisco però che non è affatto una buona soluzione.
    Comunque sì, ho tutto ciò che dici! Ogni campo di un giocatore ha il metodo getter e setter. Tutti i giocatori sono raggruppati in una ArrayList <Giocatore> nella classe ArchivioGiocatori. quindi avevo pensato di recuperare il giocatore attraverso l'indice della riga ed il campo attraverso l'indice della colonna per poi utilizzare il metodo setter al momento della modifica.
    Comunque ho tutto quello che mi hai chiesto, effettivamente devo trovare un altro modo per popolare le tabelle.
    Comunque penso che possiamo partire… Nel frattempo mi metto a lavorare sul popolamento delle tabelle (suggerimenti sono ben accetti).

    in pratica l'unica cosa che dovrei fare è trovare il modo di sostituire nel metodo print_table la String elenco con un ArrayList lista... ma come? (intendo soprattutto il creare diverse colonne a seconda dei campi di ogni singola arraylist)
    Ultima modifica di MBdip; 17-06-2014 a 13:13

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Comunque ho tutto quello che mi hai chiesto
    Ok, bene.

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    effettivamente devo trovare un altro modo per popolare le tabelle.
    Comunque penso che possiamo partire… Nel frattempo mi metto a lavorare sul popolamento delle tabelle (suggerimenti sono ben accetti)
    Se vuoi che un edit in una cella vada poi a mutare direttamente il rispettivo campo nell'oggetto Giocatore relativo a quella riga, l'approccio migliore è quello di implementare un apposito table model. Si estende AbstractTableModel e si gestisce la struttura dati con un array o List di oggetti Giocatore e si implementano i vari metodi e in particolare i getValueAt/setValueAt.

    Se non hai mai fatto una cosa del genere, potrebbe essere un po' ostico all'inizio. Cerca sul forum, probabilmente se ne è già parlato e forse ho anche fornito risposte. Trovi anche qualche esempio tra i miei "vecchi" esempi qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Scusate il doppio post, ho commesso un errore
    Ultima modifica di MBdip; 18-06-2014 a 13:16

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    scusa, era da due giorni cheaspettavo la risposta sulla pagina precedente e non avevo visto che c'era una seconda pagina…

    Comunque a quanto ho capito, mi disse cercando di dire di gestire tutte le funzionalità dei pulsanti dell'interfaccia non attraverso le classi interne del programma ma attraverso l'interfaccia stessa(in questo caso le tabelle).
    non ho però compreso il metodo setSquadra… O meglio, come deve essere implementato per fare ciò che dici?

    e poi ancora, come faccio a richiamare un metodo dello specifico TableModel? Se chiamo tabella.getModel().metodoCreato() viene restituito errore...
    Ultima modifica di MBdip; 20-06-2014 a 10:13

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    non ho però compreso il metodo setSquadra… O meglio, come deve essere implementato per fare ciò che dici?
    I metodi di TableModel servono principalmente a JTable. Ma tu hai piena facoltà (e in certi scenari come il tuo è utile) di aggiungere tutti i metodi specifici per operare in maniera più strutturata/consona sugli oggetti nel table model.

    Quindi metodi es. setSquadra, addSquadra, removeSquadra, removeAll ......

    setSquadra è banale, l'unica particolarità è il fireXXX da scegliere, visto che con un set del genere possono cambiare potenzialmente i dati di tutte le colonne nella riga settata:

    codice:
    class SquadreTableModel extends AbstractTableModel {
    
        private final  ArrayList<Squadra> squadre;
    
    
        public void setSquadra(int row, Squadra squadra) {
            squadre.set(row, squadra);
            fireTableRowsUpdated(row, row);   // notifica che è cambiata tutta la riga (potenzialmente tutte le colonne)!
        }
    
        .....
    }
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    e poi ancora, come faccio a richiamare un metodo dello specifico TableModel? Se chiamo tabella.getModel().metodoCreato() viene restituito errore...
    Perché getModel() ha tipo di ritorno TableModel, attraverso cui non puoi ovviamente "vedere" i metodi nuovi che hai definito in una implementazione specifica.
    Se tu sai che l'oggetto è realmente un SquadreTableModel, puoi fare un cast (tanto sai tu che non fallirà a runtime):

    ((SquadreTableModel) tabella.getModel()).metodoCreato()

    Ma così non è molto bello e pulito e ... dovresti oltretutto farlo ogni volta. La cosa più semplice e sensata è quella di tenerti da parte un campo apposito con il riferimento al tuo table model specifico. Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    hai ragione, mi ero proprio dimenticato di poter fare cast.
    Anche se
    Quote Originariamente inviata da andbin Visualizza il messaggio
    La cosa più semplice e sensata è quella di tenerti da parte un campo apposito con il riferimento al tuo table model specifico. Tutto qui.
    non comprendo cosa voglia dire, magari potrebbe essere la risposta alla mia prossima domanda:
    in quale occasione devo chiamare il metodo setSquadra? perché come hai specificato nella fase quotata non è molto bello e pulito fare cast ogni volta

    p.s.
    nonostante avessi creato il metodo setCapitano all'interno del modello, se lo chiamavo la tabella comunque non veniva aggiornata. Ho dovuto comunque aggiungere il metodo setSquadra per far sì che venisse aggiornata la riga della squadra.
    Quindi alla fine basterebbe chiamare il fireTableRowsUpdatedsu un campo dopo la modifica per far aggiornare lo stesso se non sbaglio. Ovviamente all'interno del modello.
    Ultima modifica di MBdip; 20-06-2014 a 15:13

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 © 2025 vBulletin Solutions, Inc. All rights reserved.