Visualizzazione dei risultati da 1 a 10 su 18

Hybrid View

  1. #1
    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

  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
    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    I tuoi esempi sono stati illuminanti! Ti ringrazio
    il problema dell'oggetto di questa discussione è stato risolto.
    ora però avrei un problemino legato ai tuoi esempi e al modo in cui ho implementato l'interfaccia.

    praticamente ho due tabelle affiancate, la tabella di destra modifica un campo della tabella di sinistra cliccando su un bottone.
    Non posso ristampare la tabella altrimenti perdo la Riga selezionata.
    La tabella di sinistra viene aggiornata nel momento in cui cricco su una riga della stessa oppure nel momento in cui passo con il mouse sui tab del jTabbedPane... Eppure non ho nessun evento di tipo mousehover...
    Come faccio a tenere aggiornata la tabella dinamicamente? (Non so per quale motivo ma appena avevo implementato le tabelle, quando cliccavo sul bottone veniva aggiornata senza perdere la selezione)



    vi posto un po' di codice:

    modello per la tabella squadre
    codice:
    class SquadreTableModel extends AbstractTableModel {
        private final String[] columnNames = { "NOME", "CAPITANO" };
    
        private final  ArrayList<Squadra> squadre;
    
        public SquadreTableModel(ArrayList<Squadra> squadre) {
            this.squadre = squadre;
        }
        @Override
        public int getRowCount() {
            return squadre.size();
        }
        @Override
        public int getColumnCount() {
            return columnNames.length;
        }
    
        @Override
        public String getColumnName(int column) {
            return columnNames[column];
        }
    
        @Override
        public boolean isCellEditable(int row, int column) {
            return true;   
        }
        @Override
        public Object getValueAt(int row, int column) {
            Squadra squadra = squadre.get(row);
    
            switch (column) {
                case 0: return squadra.getNome();
                case 1: return squadra.getCapitano().getNome()+" "+squadra.getCapitano().getCognome();
            }
    
            return null;
        }
        @Override
         public void setValueAt(Object value, int row, int column) {
            Squadra squadra = squadre.get(row);
    
            switch (column) {
                case 0: squadra.setNome((String)value); break;   
            }
            fireTableCellUpdated(row, column);
        }
    }
    modello per la tabella componenti:
    codice:
    class ComponentiTableModel extends AbstractTableModel {
        private final String[] columnNames = { "NOME", "COGNOME", "CODICE FISCALE" };
    
        private final ArrayList<Giocatore> componenti;
    
        public ComponentiTableModel(ArrayList<Giocatore> componenti) {
            this.componenti = componenti;
        }
        @Override
        public int getRowCount() {
            return componenti.size();
        }
        @Override
        public int getColumnCount() {
            return columnNames.length;
        }
    
        @Override
        public String getColumnName(int column) {
            return columnNames[column];
        }
    
        @Override
        public boolean isCellEditable(int row, int column) {
            return false;   
        }
        @Override
        public Object getValueAt(int row, int column) {
            Giocatore giocatore = componenti.get(row);
    
            switch (column) {
                case 0: return giocatore.getNome();
                case 1: return giocatore.getCognome();
                case 2: return giocatore.getCF();   
            }
    
            return null;
        }
        
    }
    metodo per aggiornare le tabelle a seconda del tab scelto
    codice:
    private void AggiornaInterfaccia() {
            ArrayList lista_giocatori=database.get_ArchivioGiocatori().getGiocatori();
            ArrayList lista_squadre=database.get_ArchivioSquadre().getSquadre();
            ArrayList lista_partite=database.get_ArchivioPartite().getPartite();
    
            switch (tabMain.getSelectedIndex()) {
                case 0:
                    // Aggiorno elenco giocatori
                    GiocatoriTableModel model0= new GiocatoriTableModel(lista_giocatori);
                    jTableGio.setModel(model0);
                    break;
                case 1:
                    // Aggiorno elenco squadre
                    SquadreTableModel model1=new SquadreTableModel(lista_squadre);
                    jTableSqu.setModel(model1);
                    jButtonImpostaCapitano.setVisible(false);
                    update_componenti();
                    break;
                case 2:
                    // Aggiorno elenco partite
                    PartiteTableModel model2=new PartiteTableModel(lista_partite);
                    jTablePar.setModel(model2);
                    break;      
            }                
    
        }
    metodo per aggiornare i componenti della squadra
    codice:
    private void update_componenti(){
            int rowIndex = jTableSqu.getSelectedRow();
            ArrayList lista_componenti;
            if(rowIndex>=0){
                Squadra squadra = database.get_ArchivioSquadre().getSquadre().get(rowIndex);
                lista_componenti=squadra.get_componenti();
                ComponentiTableModel model0= new ComponentiTableModel(lista_componenti);
                jTableSquComponenti.setModel(model0);
                jButtonImpostaCapitano.setVisible(squadra.get_componenti().size()>0);
            }
    }
    pulsante per impostare il capitano
    codice:
    private void jButtonImpostaCapitanoActionPerformed(java.awt.event.ActionEvent evt) {                                                       
            int rowIndex=jTableSquComponenti.getSelectedRow();
            int rowSquadraIndex =jTableSqu.getSelectedRow();
    
            if(rowIndex<0)
                lblMessage.setText(Errori.errSelezionareRiga);
            else{
                Squadra s=database.get_ArchivioSquadre().getSquadre().get(rowSquadraIndex);
                Giocatore g=s.get_componenti().get(rowIndex);
                s.setCapitano(g);
            }
        }
    Ultima modifica di MBdip; 18-06-2014 a 12:39

  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
    praticamente ho due tabelle affiancate, la tabella di destra modifica un campo della tabella di sinistra cliccando su un bottone.

    codice:
    private void jButtonImpostaCapitanoActionPerformed(java.awt.event.ActionEvent evt) {                                                       
            int rowIndex=jTableSquComponenti.getSelectedRow();
            int rowSquadraIndex =jTableSqu.getSelectedRow();
    
            if(rowIndex<0)
                lblMessage.setText(Errori.errSelezionareRiga);
            else{
                Squadra s=database.get_ArchivioSquadre().getSquadre().get(rowSquadraIndex);
                Giocatore g=s.get_componenti().get(rowIndex);
                s.setCapitano(g);
            }
        }
    Il problema di questo codice sopra è che se modifichi solo e semplicemente l'oggetto Squadra, il tuo table model SquadreTableModel non ne "sa" nulla del fatto che hai aggiornato l'oggetto esternamente al table model che lo gestisce!

    Una cosa più bella che puoi fare è mettere in SquadreTableModel un nuovo metodo specifico per la tua applicazione:

    codice:
    public void setCapitano(int row, Giocatore capitano) {
        .......
    }

    In questo modo è il table model che "sa" e va ad aggiornare l'oggetto Squadra alla tal riga e inoltre può anche fare il fire appropriato per aggiornare visivamente il capitano.


    P.S. i tuoi table model mi sembrano corretti, perlomeno visti così in generale. Ci sarebbero alcune finezze che potresti migliorare, ad esempio:
    - in SquadreTableModel la colonna del capitano non è editabile (nel setValueAt non la gestisci), quindi isCellEditable potrebbe dare false per la colonna del capitano.
    - inoltre, giusto solo per efficienza, sarebbe meglio fare fireTableCellUpdated solo se veramente hai cambiato qualcosa. Quindi puoi mettere un default: return; così esce senza fare fireTableCellUpdated se non è una delle colonne settabili.
    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
    ma la cosa strana è che, non so per quale strano motivo, in una prima implementazione funzionava! Ad esempio se cancellavo un giocatore che era capitano, automaticamente veniva aggiornata la tabella squadre settando a "" il capitano.
    comunque, ho seguito il tuo consiglio e ho fatto ritornare (isCellEditable) false alla colonna capitano.


    Perdonami la domanda, ma per quale motivo (dopo aver impostato nuovo capitano o cancellato il giocatore capitano) se passo col mouse sui tab del jTabbedPane oppure se clicco sulla tabella, Quest'ultima viene aggiornata?

    come fa a "sapere" che è cambiato qualcosa? Eppure non ho inserito alcun eventHandler... e soprattutto lo fa senza perdere la selezione (nel caso di passaggio del mouse sui TAB).
    eppure all'inizio funzionava... Cioè la tabella veniva aggiornata in modo automatico...
    Non ci sarebbe un modo per rendere la tabella dinamica? Cioè, Se modifico qualcosa in un'altra finestra, viene modificata la tabella che legge direttamente le modifiche dell'arraylist.
    Ultima modifica di MBdip; 18-06-2014 a 15:18

  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
    non ho idea di dove mettere default: return;.
    Io intendevo:

    codice:
    public void setValueAt(Object value, int row, int column) {
        Squadra squadra = squadre.get(row);
    
        switch (column) {
            case 0: squadra.setNome((String)value); break;
            default: return;
        }
        fireTableCellUpdated(row, column);
    }
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Perdonami la domanda, ma per quale motivo (dopo aver impostato nuovo capitano o cancellato il giocatore capitano) se passo col mouse sui tab del jTabbedPane oppure se clicco sulla tabella, Quest'ultima viene aggiornata?
    come fa a "sapere" che è cambiato qualcosa?
    No, infatti non è questione di "sapere" che qualcosa è stato modificato. Si tratta al massimo di un semplice "repaint". Ma se un repaint (per qualunque motivo) arriva alla tabella, allora vengono sicuramente coinvolti i renderer, che quindi riprendendo i dati dal model di fatto aggiornano visivamente i dati.

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Non ci sarebbe un modo per rendere la tabella dinamica? Cioè, Se modifico qualcosa in un'altra finestra, viene modificata la tabella che legge direttamente le modifiche dell'arraylist.
    È solo questione di "parlare" direttamente con i table model. Che chiaramente possono/devono offrire i metodi specifici per operare le varie modifiche.

    Ad esempio visto che prima avevi scritto:

    codice:
                Squadra s=database.get_ArchivioSquadre().getSquadre().get(rowSquadraIndex);
                Giocatore g=s.get_componenti().get(rowIndex);
                s.setCapitano(g);

    Volendo continuare a gestire la cosa così, si poteva anche fare in una maniera effettivamente ancora più semplice, ovvero mettere in SquadreTableModel un nuovo metodo:

    public void setSquadra(int row, Squadra squadra)

    che aggiorna la struttura dati e notifica i cambiamenti. E sarebbe in effetti anche più generico e più in linea con il concetto del table model, rispetto al setCapitano che immaginavo prima.

    E in SquadreTableModel puoi aggiungere altri metodi ancora:

    public void addSquadra(Squadra squadra)
    public void removeSquadra(int row)
    ecc....

    Insomma puoi mettere tutti i metodi che sono sensati per le operazioni che devi poter applicare.
    Ultima modifica di andbin; 18-06-2014 a 15:24
    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
    Quote Originariamente inviata da andbin Visualizza il messaggio
    codice:
    private SquadreTableModel squadreTableModel;
    intendi operare sul modello anzichè sulla tabella?
    esempio

    codice:
    private void jButtonImpostaCapitanoActionPerformed(java.awt.event.ActionEvent evt) {
    
            int rowIndex=jTableSquComponenti.getSelectedRow();
            int rowSquadraIndex =jTableSqu.getSelectedRow();
    /******/SquadreTableModel squadreTableModel= (SquadreTableModel)jTableSqu.getModel();/***/
            if(rowIndex<0)
                lblMessage.setText(Errori.errSelezionareRiga);
            else{
                Squadra s=database.get_ArchivioSquadre().getSquadre().get(rowSquadraIndex);
                Giocatore g=s.get_componenti().get(rowIndex);
    /*********/ squadreTableModel.setCapitano(s,g);/*********************************/
            }
        }
    Ultima modifica di MBdip; 20-06-2014 a 16:22

  8. #8
    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
    intendi operare sul modello anzichè sulla tabella?
    Appunto dovresti, certo, operare sul model. Dentro il model puoi modellare le cose come meglio credi (es. il fatto di aver implementato un table model che contiene un ArrayList<Squadra>) e da lì puoi "esporre" le operazioni che servono e sono utili al resto della applicazione.
    Su JTable direttamente c'è relativamente ben poco che puoi fare riguardo i dati e oltretutto gli indici di riga/colonna sono nella "view" ... non direttamente sul model (possono differire).


    Quote Originariamente inviata da MBdip Visualizza il messaggio
    codice:
    private void jButtonImpostaCapitanoActionPerformed(java.awt.event.ActionEvent evt) {
    
            int rowIndex=jTableSquComponenti.getSelectedRow();
            int rowSquadraIndex =jTableSqu.getSelectedRow();
    /******/SquadreTableModel squadreTableModel= (SquadreTableModel)jTableSqu.getModel();/***/
            if(rowIndex<0)
                lblMessage.setText(Errori.errSelezionareRiga);
            else{
                Squadra s=database.get_ArchivioSquadre().getSquadre().get(rowSquadraIndex);
                Giocatore g=s.get_componenti().get(rowIndex);
    /*********/ squadreTableModel.setCapitano(s,g);/*********************************/
            }
        }
    codice:
    squadreTableModel.setSquadra(rowSquadraIndex, s);

    invece di quel setCapitano
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava 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 © 2025 vBulletin Solutions, Inc. All rights reserved.