Jframe jtable

di il
230 risposte

230 Risposte - Pagina 5

  • Re: Jframe jtable

    KuroKami69 ha scritto:


    prima di riuscire a pensare OOP mi serve fare almeno altri 3-4 programmi, il prossimo che farò sarà un semplice gioco della tombola con i timer.
    Per esercitarsi sulla OOP si può benissimo ignorare le GUI. Ci sono molte cose che puoi fare ad esempio con tue gerarchie di classi. Hai già fatto i "classici" esercizi con gerarchie di figure piane o solide??
  • Re: Jframe jtable

    Ok primo intoppo.
    perché diamine mi da errore questa riga?
    
    public class AutomobileTableModel extends AbstractTableModel 
    
    dato che il mio public class TableModel extends AbstractTableModel{ mi dava errore, ho fatto un copia e incolla del tuo, e mi da questo errore
    
    .\AutomobileTableModel.java:6: error: AutomobileTableModel is not abstract and d
    oes not override abstract method getValueAt(int,int) in TableModel
    public class AutomobileTableModel extends AbstractTableModel
    
    nel mio codice attualmente non richiamo nessun getValueAt()
    quindi non capisco perché mi dia questo problema
  • Re: Jframe jtable

    andbin ha scritto:


    KuroKami69 ha scritto:


    prima di riuscire a pensare OOP mi serve fare almeno altri 3-4 programmi, il prossimo che farò sarà un semplice gioco della tombola con i timer.
    Per esercitarsi sulla OOP si può benissimo ignorare le GUI. Ci sono molte cose che puoi fare ad esempio con tue gerarchie di classi. Hai già fatto i "classici" esercizi con gerarchie di figure piane o solide??
    avevamo cominciato, durante le ore di laboratorio, a fare le classi delle varie figure geometriche, quadrato, cubo, triangolo, però il resto della classe che deve ancora capire come usare un if, nonostante sia argomento di inizio terza, quindi il prof di laboratorio, su richiesta loro è passato a fare quel tipo di lezione dove lui sta al pc, loro gli dicono il codice da scrivere e lui lo scrive. il tutto proiettato con il proiettore.
    EDIT: a seguito della decisione della classe di lavorare in questa maniera, che reputo oscena visti gli scarsi, se non nulli risultati, ho deciso di dedicarmi a fare questo primo lavoro proposto dai prof, approfondendo l'esercizio e migliorandone le funzionalità proposte all'inizio
    ovviamente finisce che il prof fa il 90% del complesso e gli altri guardano, non imparano 'na mazza e la classe è FERMA.
    scusa la spiegazione/sfogo, comunque questa è la situazione attuale in cui mi trovo. ho provato a chiedere di poter andare avanti, ma mi han detto che devo arrangiarmi perché non possono avere una classe dove uno, sotto i loro insegnamenti, arriva, non so alle interfacce, e il resto della classe sta iniziando a capire le classi
    conta che poi finche si fa lezione, anche se loro stanno lavorando al pc con i prof che passano e aiutano chi ha bisogno, spesso se chiedo qualcosa di più "avanzato", mi sento rispondere "non stiamo facendo questo argomento per cui usa internet". altre volte mi spiegano, ma son più quelle che mi dicono di usare internet. così ho smesso di chiedere
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    
    .\AutomobileTableModel.java:6: error: AutomobileTableModel is not abstract and d
    oes not override abstract method getValueAt(int,int) in TableModel
    public class AutomobileTableModel extends AbstractTableModel
    
    Se scrivi da zero la classe ovvero metti:
    public class XyzTableModel extends AbstractTableModel {
        // e non metti ancora nulla
    }
    il compilatore/IDE ti dà un errore perché mancano dei metodi. Specialmente quando si estendono classi astratte che implementano parzialmente delle interfacce (è proprio il caso di AbstractTableModel che non implementa di serie tutti i metodi di TableModel), ci possono essere metodi che DEVI scrivere tu e altri metodi che PUOI ridefinire per fare qualcosa di meglio o di più.

    NON ti "fissare" sul fatto di avere degli errori. Vai avanti, LEGGI i messaggi di errore ed agisci di conseguenza. "is not abstract and does not override abstract method getValueAt(int,int)" vuol dire che la tua classe non è astratta (perché ovviamente intendi fare una classe concreta) e non definisce quel metodo. Semplicemente DEVI scriverlo tu.

    Non ti bloccare per queste cose.

    KuroKami69 ha scritto:


    quindi il prof di laboratorio, su richiesta loro è passato a fare quel tipo di lezione dove lui sta al pc, loro gli dicono il codice da scrivere e lui lo scrive. il tutto proiettato con il proiettore.
    Ma che roba è .....


    P.S. va bene se vuoi fare progettini grafici con JTable e altro. Ma cerca anche di fare esercitazioni più sulla programmazione ad oggetti: gerarchie di classi, uso di array, collezioni, e altro.
  • Re: Jframe jtable

    andbin ha scritto:


    KuroKami69 ha scritto:


    
    .\AutomobileTableModel.java:6: error: AutomobileTableModel is not abstract and d
    oes not override abstract method getValueAt(int,int) in TableModel
    public class AutomobileTableModel extends AbstractTableModel
    
    Se scrivi da zero la classe ovvero metti:
    public class XyzTableModel extends AbstractTableModel {
        // e non metti ancora nulla
    }
    il compilatore/IDE ti dà un errore perché mancano dei metodi. Specialmente quando si estendono classi astratte che implementano parzialmente delle interfacce (è proprio il caso di AbstractTableModel che non implementa di serie tutti i metodi di TableModel), ci possono essere metodi che DEVI scrivere tu e altri metodi che PUOI ridefinire per fare qualcosa di meglio o di più.

    NON ti "fissare" sul fatto di avere degli errori. Vai avanti, LEGGI i messaggi di errore ed agisci di conseguenza. "is not abstract and does not override abstract method getValueAt(int,int)" vuol dire che la tua classe non è astratta (perché ovviamente intendi fare una classe concreta) e non definisce quel metodo. Semplicemente DEVI scriverlo tu.

    Non ti bloccare per queste cose.
    Ho capito, grazie mille, allora ogni volta che mi dirá qualcosa di simile farò il metodo e ne farò l'override

    andbin ha scritto:


    KuroKami69 ha scritto:


    quindi il prof di laboratorio, su richiesta loro è passato a fare quel tipo di lezione dove lui sta al pc, loro gli dicono il codice da scrivere e lui lo scrive. il tutto proiettato con il proiettore.
    Ma che roba è .....
    Il nuovo programma ministeriale a moduli. Ora anche se in terza hai 5 materie sotto, ti fanno comunque passare l'anno e ti dicono che puoi recuperare le materie che hai sotto facendo una verifica di recupero per ogni modulo in cui non si ha raggiunto la sufficenza. Ergo se uno è un asino, non importa, passerá comunque l'anno

    andbin ha scritto:


    P.S. va bene se vuoi fare progettini grafici con JTable e altro. Ma cerca anche di fare esercitazioni più sulla programmazione ad oggetti: gerarchie di classi, uso di array, collezioni, e altro.
    In effetti è una lacuna che ho quella di non saper gestire bene queste cose. Magari quando ho finito questo, poi rendo automobili una superclasse e i suoi metodi li ridefinisco in una classe che specializza l'auto stessa dandole gli attributi, non so se mi son spiegato mmh
  • Re: Jframe jtable

    Bene finalmente stasera mi son rimesso sul codice, ho dato una riletta al tuo per vedere le parti essenziali richieste per questa classe ed effettivamente, quello che ad un primo momento non ho notato ora mi porta qualche domanda
    
    public Class<?> getColumnClass(int columnIndex) {
            return tipiColonne[columnIndex];  // espone il tipo alla tal colonna
        }
    
    anzitutto, perché quel <?>?

    poi
    
    private static final Class<?>[] tipiColonne = { String.class, String.class, Integer.class };
    
    anche qua, le chiavi static non le ho ancora fatte, anche se ho una vaga idea di cosa fanno, ma di nuovo, perché <?>? e perché hai scritto String.class?

    EDIT: onestamente ora che sto provando a buttare giù del codice mio, non riesco a immaginare completamente il funzionamento della tua classe tablemodel

    andando con ordine
    
    private static final String[] nomiColonne = { "Marca", "Modello", "Anno" };
    private static final Class<?>[] tipiColonne = { String.class, String.class, Integer.class };
    
    qua crei 2 array, il primo sicuro, il secondo forse crei un array di classi? probabilmente si
    EDIT: daje non son capace di fare una cosa unica. qua tu sostanzialmente rendi l'intera colonna, o più propriamente l'header della colonna, e di conseguenza la colonna stessa, una classe a cui poi bindi il metodo relativo. quindi se ad esempio io ho 10 auto, questa mi chiama 10 volte il metodo get.modello per esempio?
    
    private List<Automobile> automobili;
    
    qua crei una lista di oggetti automobile e a questa lista dai il nome automobili
    
    public AutomobileTableModel(List<Automobile> automobili) {
    this.automobili = automobili;
    }
    
    vabbeh questo è il costruttore, a cui dici "hey, questa lista ha i valori della lista che ti passo" (in teoria, poi forse ho frainteso)
    
    @Override
    public String getColumnName(int columnIndex) {
    return nomiColonne[columnIndex];  // espone il nome alla tal colonna
    }
    
    qua, non son sicuro, anzi non l'ho capita. non ne capisco l'utilizzo. riceve una variabile di tipo int, da non ho capito dove e la usa per dire "sei sulla colonna n". credo
    
    
    @Override
    public Class<?> getColumnClass(int columnIndex) {
    return tipiColonne[columnIndex];  // espone il tipo alla tal colonna
    }
    
    qua, se non ho frainteso, hai reso le colonne della tabella delle classi, ma non capisco cosa fa, dove va a lavorare questo metodo ne da dove riceve l'input
    
    @Override
    public int getRowCount() {
    return automobili.size();  // espone il numero di righe (È il numero di elementi nella lista)
    }
    
    questo è abbastanza banale, ritorna la grandezza della lista di automobili e quindi quante righe dovrà avere la mia tabella. io questo metodo per usarlo con i listener, lo richiamerò nel metodo del listener quando lo associo al bottone che mi lavora con lo spinner giusto?
    
    @Override
    public int getColumnCount() {
    return nomiColonne.length;  // espone il numero di colonne (È il numero di nomi)
    }
    
    mentre questo invece ritorna il numero di colonne che compongono la tabella
    
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    Automobile automobile = automobili.get(rowIndex);
    
    switch (columnIndex) {
    case 0: return automobile.getMarca();
    case 1: return automobile.getModello();
    case 2: return automobile.getAnno();
    default: return null;   // non dovrebbe succedere
    }
    
    questo è quello che mi lascia più perplesso. prende in ingresso il return degli ultimi 2 metodi che hai scritto, e che di conseguenza ho copiato qua giusto?
    poi crei un oggetto automobile usando il costruttore presente nella lista automobili. ma quel rowindex devo ancora capire da dove lo tiri fuori
    poi sostanzialmente usi uno switch e dici "se columnindex vale 0 mi ritorni il metodo get marca e via dicendo" se non ha valori mi ritorni null.
    ok ma allora. non ho capito il funzionamento globale. non capisco dove poi i vari metodi vengono usati e la cosa mi manda nel pallone più totale. più provo a capire e meno capisco e più mi irrito

    EDIT: ragionandoci un attimo su, questi metodi vengono chiamati continuamente da JTable per aggiornare la tabella o mi sbaglio? quindi la loro chiamata starà in quello che sarà il file java di JTable giusto?

    EDIT: di nuovo si.
    giocandola molto a fumetto succede più o meno questo
    il mio frame con la tabella è in esecuzione.
    la tabella ha un listener incorporato diciamo, che appena accade qualcosa di significativo dentro al frame, tipo la pressione di un bottone o anche la scelta di un radio, jtable va a chiamare nuovamente i metodi nel tablemodel per aggiornarsi. impostando opportunamente i listener, posso essere io a dire a jtable secondo quali eventi fare qualcosa
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    quello che ad un primo momento non ho notato ora mi porta qualche domanda
    Iniziamo con una panoramica generale, perché credo non hai ancora afferrato il ruolo del table model.

    Immagina di essere TU il table model. Immagina di prendere magari un foglio di carta e di fare uno "schizzo" della tabella annotando dei dati nelle celle. Io NON so come hai fatto la tabella (quanto è grande, ecc..), non so nulla e non "vedo" come stai tenendo o annotando quei dati.

    Allora inizio a chiederti delle informazioni: bene KuroKami69, dimmi quante righe e colonne ci sono nella tua tabella ( getRowCount() e getColumnCount() ), magari tu restituisci 20 da getRowCount() e 5 da getColumnCount().

    Allora inizio a chiederti altro:
    - quale è il nome della prima colonna? ( getColumnName(0) ) e magari tu mi restituisci "Marca"
    - quale è il nome della seconda colonna? ( getColumnName(1) ) e magari tu mi restituisci "Modello"
    - ecc...

    - quale è il tipo della prima colonna? ( getColumnClass(0) ) e magari tu mi restituisci String.class
    - ecc...

    Poi inizio a chiederti i dati (e in quale sequenza NON è importante per te):
    - quale è il dato Object alla cella (0,0) ( getValueAt(0, 0) ) e magari tu mi restituisci "Fiat" (perché hai preso il Automobile riga 0 ed estratto il campo della Marca con getMarca() ).
    - quale è il dato Object alla cella (0,1) ( getValueAt(0, 1) ) e magari tu mi restituisci "Punto"
    - ecc...

    Insomma, io chiedendoti tutte queste informazioni riesco a capire come è fatta la tabella, con quali colonne e di che tipo e che dati ci sono. E questo serve alla parte "visuale" della tabella per mostrare tutti i dati nel modo appropriato secondo quanto DETTATO dal table model.

    KuroKami69 ha scritto:


    
    public Class<?> getColumnClass(int columnIndex) {
            return tipiColonne[columnIndex];  // espone il tipo alla tal colonna
        }
    
    anzitutto, perché quel <?>?
    Le parametrizzazioni con < > sono relative ai "generics", una grossa funzionalità introdotta in Java 5. Mettere un <?> vuol dire che non si "sa" quale è la parametrizzazione. Se hai una variabile List<String> sai per certo che hai una lista che contiene solo String. Se hai una variabile List<?> vuol dire che non sai a priori quale è la parametrizzazione concreta della lista assegnata alla variabile (NON vuol dire che nella lista ci puoi mettere quello che vuoi!)

    KuroKami69 ha scritto:


    
    private static final Class<?>[] tipiColonne = { String.class, String.class, Integer.class };
    
    anche qua, le chiavi static non le ho ancora fatte, anche se ho una vaga idea di cosa fanno, ma di nuovo, perché <?>? e perché hai scritto String.class?
    I membri static "dovresti" saperli già se sei a questo punto. Quindi affronta questo argomento. Idem, la parametrizzazione del Class non è importante. E String.class è il valore "letterale" della classe String. E' come se tu facessi "pippo".getClass()

    KuroKami69 ha scritto:


    non riesco a immaginare completamente il funzionamento della tua classe tablemodel
    Vedi panoramica iniziale.

    KuroKami69 ha scritto:


    
    private static final String[] nomiColonne = { "Marca", "Modello", "Anno" };
    private static final Class<?>[] tipiColonne = { String.class, String.class, Integer.class };
    
    qua crei 2 array, il primo sicuro, il secondo forse crei un array di classi? probabilmente si
    Si un array di String e poi un array di Class che sono istanze ad oggetti java.lang.Class che descrivono quella tal classe/interfaccia.

    KuroKami69 ha scritto:


    EDIT: daje non son capace di fare una cosa unica. qua tu sostanzialmente rendi l'intera colonna, o più propriamente l'header della colonna, e di conseguenza la colonna stessa, una classe a cui poi bindi il metodo relativo. quindi se ad esempio io ho 10 auto, questa mi chiama 10 volte il metodo get.modello per esempio?
    NON ho capito questa tua parte/dubbio.

    KuroKami69 ha scritto:


    
    private List<Automobile> automobili;
    
    qua crei una lista di oggetti automobile e a questa lista dai il nome automobili

    KuroKami69 ha scritto:


    
    public AutomobileTableModel(List<Automobile> automobili) {
    this.automobili = automobili;
    }
    
    vabbeh questo è il costruttore, a cui dici "hey, questa lista ha i valori della lista che ti passo" (in teoria, poi forse ho frainteso)
    Sì, banalmente si tiene nel campo di istanza il riferimento alla lista ricevuta in argomento.

    KuroKami69 ha scritto:


    
    @Override
    public String getColumnName(int columnIndex) {
    return nomiColonne[columnIndex];  // espone il nome alla tal colonna
    }
    
    qua, non son sicuro, anzi non l'ho capita. non ne capisco l'utilizzo. riceve una variabile di tipo int, da non ho capito dove e la usa per dire "sei sulla colonna n". credo
    Vedi di nuovo panoramica generale iniziale.

    KuroKami69 ha scritto:


    
    @Override
    public Class<?> getColumnClass(int columnIndex) {
    return tipiColonne[columnIndex];  // espone il tipo alla tal colonna
    }
    
    qua, se non ho frainteso, hai reso le colonne della tabella delle classi, ma non capisco cosa fa, dove va a lavorare questo metodo ne da dove riceve l'input
    Il Class della colonna serve a JTable per scegliere quale renderer/editor utilizzare. Se hai provato ad eseguire il mio esempio, hai notato che l'anno è allineato a DESTRA? Questo perché con Integer.class JTable va a scegliere un renderer che presenta il dato allineato a destra e lo tratta strettamente come numero.

    KuroKami69 ha scritto:


    
    @Override
    public int getRowCount() {
    return automobili.size();  // espone il numero di righe (È il numero di elementi nella lista)
    }
    
    questo è abbastanza banale, ritorna la grandezza della lista di automobili e quindi quante righe dovrà avere la mia tabella.

    KuroKami69 ha scritto:


    io questo metodo per usarlo con i listener, lo richiamerò nel metodo del listener quando lo associo al bottone che mi lavora con lo spinner giusto?
    No, o perlomeno non è chiaro COSA vuoi fare.

    KuroKami69 ha scritto:


    
    @Override
    public int getColumnCount() {
    return nomiColonne.length;  // espone il numero di colonne (È il numero di nomi)
    }
    
    mentre questo invece ritorna il numero di colonne che compongono la tabella

    KuroKami69 ha scritto:


    
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    Automobile automobile = automobili.get(rowIndex);
    
    switch (columnIndex) {
    case 0: return automobile.getMarca();
    case 1: return automobile.getModello();
    case 2: return automobile.getAnno();
    default: return null;   // non dovrebbe succedere
    }
    
    questo è quello che mi lascia più perplesso. prende in ingresso il return degli ultimi 2 metodi che hai scritto, e che di conseguenza ho copiato qua giusto?
    poi crei un oggetto automobile usando il costruttore presente nella lista automobili. ma quel rowindex devo ancora capire da dove lo tiri fuori
    poi sostanzialmente usi uno switch e dici "se columnindex vale 0 mi ritorni il metodo get marca e via dicendo" se non ha valori mi ritorni null.
    ok ma allora. non ho capito il funzionamento globale. non capisco dove poi i vari metodi vengono usati e la cosa mi manda nel pallone più totale. più provo a capire e meno capisco e più mi irrito
    Ri-vedi spiegazione iniziale generale.

    KuroKami69 ha scritto:


    EDIT: ragionandoci un attimo su, questi metodi vengono chiamati continuamente da JTable per aggiornare la tabella o mi sbaglio?
    Sì li chiama la parte visuale di JTable.

    KuroKami69 ha scritto:


    quindi la loro chiamata starà in quello che sarà il file java di JTable giusto?
    Dovrei andare a verificare se è davvero JTable o la parte del Look&Feel di JTable.
  • Re: Jframe jtable

    andbin ha scritto:


    KuroKami69 ha scritto:


    quello che ad un primo momento non ho notato ora mi porta qualche domanda
    Iniziamo con una panoramica generale, perché credo non hai ancora afferrato il ruolo del table model.

    Immagina di essere TU il table model. Immagina di prendere magari un foglio di carta e di fare uno "schizzo" della tabella annotando dei dati nelle celle. Io NON so come hai fatto la tabella (quanto è grande, ecc..), non so nulla e non "vedo" come stai tenendo o annotando quei dati.

    Allora inizio a chiederti delle informazioni: bene KuroKami69, dimmi quante righe e colonne ci sono nella tua tabella ( getRowCount() e getColumnCount() ), magari tu restituisci 20 da getRowCount() e 5 da getColumnCount().

    Allora inizio a chiederti altro:
    - quale è il nome della prima colonna? ( getColumnName(0) ) e magari tu mi restituisci "Marca"
    - quale è il nome della seconda colonna? ( getColumnName(1) ) e magari tu mi restituisci "Modello"
    - ecc...

    - quale è il tipo della prima colonna? ( getColumnClass(0) ) e magari tu mi restituisci String.class
    - ecc...

    Poi inizio a chiederti i dati (e in quale sequenza NON è importante per te):
    - quale è il dato Object alla cella (0,0) ( getValueAt(0, 0) ) e magari tu mi restituisci "Fiat" (perché hai preso il Automobile riga 0 ed estratto il campo della Marca con getMarca() ).
    - quale è il dato Object alla cella (0,1) ( getValueAt(0, 1) ) e magari tu mi restituisci "Punto"
    - ecc...

    Insomma, io chiedendoti tutte queste informazioni riesco a capire come è fatta la tabella, con quali colonne e di che tipo e che dati ci sono. E questo serve alla parte "visuale" della tabella per mostrare tutti i dati nel modo appropriato secondo quanto DETTATO dal table model.
    si, era più o meno quello che immaginavo, forse mi son espresso male nell'altro post ma volevo dire più o meno questo

    andbin ha scritto:


    KuroKami69 ha scritto:


    
    public Class<?> getColumnClass(int columnIndex) {
            return tipiColonne[columnIndex];  // espone il tipo alla tal colonna
        }
    
    anzitutto, perché quel <?>?
    Le parametrizzazioni con < > sono relative ai "generics", una grossa funzionalità introdotta in Java 5. Mettere un <?> vuol dire che non si "sa" quale è la parametrizzazione. Se hai una variabile List<String> sai per certo che hai una lista che contiene solo String. Se hai una variabile List<?> vuol dire che non sai a priori quale è la parametrizzazione concreta della lista assegnata alla variabile (NON vuol dire che nella lista ci puoi mettere quello che vuoi!)

    KuroKami69 ha scritto:


    
    private static final Class<?>[] tipiColonne = { String.class, String.class, Integer.class };
    
    anche qua, le chiavi static non le ho ancora fatte, anche se ho una vaga idea di cosa fanno, ma di nuovo, perché <?>? e perché hai scritto String.class?
    I membri static "dovresti" saperli già se sei a questo punto. Quindi affronta questo argomento. Idem, la parametrizzazione del Class non è importante. E String.class è il valore "letterale" della classe String. E' come se tu facessi "pippo".getClass()

    KuroKami69 ha scritto:


    non riesco a immaginare completamente il funzionamento della tua classe tablemodel
    Vedi panoramica iniziale.

    KuroKami69 ha scritto:


    
    private static final String[] nomiColonne = { "Marca", "Modello", "Anno" };
    private static final Class<?>[] tipiColonne = { String.class, String.class, Integer.class };
    
    qua crei 2 array, il primo sicuro, il secondo forse crei un array di classi? probabilmente si
    Si un array di String e poi un array di Class che sono istanze ad oggetti java.lang.Class che descrivono quella tal classe/interfaccia.
    fin qua ok

    andbin ha scritto:


    KuroKami69 ha scritto:


    EDIT: daje non son capace di fare una cosa unica. qua tu sostanzialmente rendi l'intera colonna, o più propriamente l'header della colonna, e di conseguenza la colonna stessa, una classe a cui poi bindi il metodo relativo. quindi se ad esempio io ho 10 auto, questa mi chiama 10 volte il metodo get.modello per esempio?
    NON ho capito questa tua parte/dubbio.
    ho immaginato che l'intera colonna è come una classe dove avrà un suo metodo private che farà vedere i dati al suo interno. forse mi son sbagliato?

    andbin ha scritto:


    KuroKami69 ha scritto:


    
    private List<Automobile> automobili;
    
    qua crei una lista di oggetti automobile e a questa lista dai il nome automobili

    KuroKami69 ha scritto:


    
    public AutomobileTableModel(List<Automobile> automobili) {
    this.automobili = automobili;
    }
    
    vabbeh questo è il costruttore, a cui dici "hey, questa lista ha i valori della lista che ti passo" (in teoria, poi forse ho frainteso)
    Sì, banalmente si tiene nel campo di istanza il riferimento alla lista ricevuta in argomento.

    KuroKami69 ha scritto:


    
    @Override
    public String getColumnName(int columnIndex) {
    return nomiColonne[columnIndex];  // espone il nome alla tal colonna
    }
    
    qua, non son sicuro, anzi non l'ho capita. non ne capisco l'utilizzo. riceve una variabile di tipo int, da non ho capito dove e la usa per dire "sei sulla colonna n". credo
    Vedi di nuovo panoramica generale iniziale.

    KuroKami69 ha scritto:


    
    @Override
    public Class<?> getColumnClass(int columnIndex) {
    return tipiColonne[columnIndex];  // espone il tipo alla tal colonna
    }
    
    qua, se non ho frainteso, hai reso le colonne della tabella delle classi, ma non capisco cosa fa, dove va a lavorare questo metodo ne da dove riceve l'input
    Il Class della colonna serve a JTable per scegliere quale renderer/editor utilizzare. Se hai provato ad eseguire il mio esempio, hai notato che l'anno è allineato a DESTRA? Questo perché con Integer.class JTable va a scegliere un renderer che presenta il dato allineato a destra e lo tratta strettamente come numero.

    KuroKami69 ha scritto:


    
    @Override
    public int getRowCount() {
    return automobili.size();  // espone il numero di righe (È il numero di elementi nella lista)
    }
    
    questo è abbastanza banale, ritorna la grandezza della lista di automobili e quindi quante righe dovrà avere la mia tabella.
    fin qua abbastanza chiaro, l'unica, quel columnIndex glielo passa jtable o comunque un suo componente giusto?

    andbin ha scritto:


    KuroKami69 ha scritto:


    io questo metodo per usarlo con i listener, lo richiamerò nel metodo del listener quando lo associo al bottone che mi lavora con lo spinner giusto?
    No, o perlomeno non è chiaro COSA vuoi fare.
    allora. nel jframe io ho 1 bottone, 3 radio, uno spinner e 1 checkbox. con lo spinner scelgo quanti veicoli mostrare, e visto che volevo far vedere sia una visualizzazione dinamica, che una a "comando", non mi viene il termine ora, ho messo che il bottone quando viene premuto mi ritorna il numero di veicoli che ho messo nello spinner
    
    SpinnerModel jsm = new SpinnerNumberModel(10, 0, 1000, 5);
    final JSpinner js = new JSpinner(jsm);
    JButton b = new JButton("Visualizza");
    b.addActionListener(new ActionListener()
    {
    	public void actionPerformed(ActionEvent e)
    	{
    		Integer i = (Integer)js.getValue();
    		atm.getRowCount(i);
    	}
    });
    
    ho fatto il casting in integer del valore e poi chiamando qua il metodo getrowcount del mio tablemodel, sono io che dico alla jtable, quando premo il bottone, "hey jtable, la tabella deve avere n righe" giusto? forse non mi son spiegato bene mmh

    andbin ha scritto:


    KuroKami69 ha scritto:


    
    @Override
    public int getColumnCount() {
    return nomiColonne.length;  // espone il numero di colonne (È il numero di nomi)
    }
    
    mentre questo invece ritorna il numero di colonne che compongono la tabella

    KuroKami69 ha scritto:


    
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    Automobile automobile = automobili.get(rowIndex);
    
    switch (columnIndex) {
    case 0: return automobile.getMarca();
    case 1: return automobile.getModello();
    case 2: return automobile.getAnno();
    default: return null;   // non dovrebbe succedere
    }
    
    questo è quello che mi lascia più perplesso. prende in ingresso il return degli ultimi 2 metodi che hai scritto, e che di conseguenza ho copiato qua giusto?
    poi crei un oggetto automobile usando il costruttore presente nella lista automobili. ma quel rowindex devo ancora capire da dove lo tiri fuori
    poi sostanzialmente usi uno switch e dici "se columnindex vale 0 mi ritorni il metodo get marca e via dicendo" se non ha valori mi ritorni null.
    ok ma allora. non ho capito il funzionamento globale. non capisco dove poi i vari metodi vengono usati e la cosa mi manda nel pallone più totale. più provo a capire e meno capisco e più mi irrito
    Ri-vedi spiegazione iniziale generale.

    KuroKami69 ha scritto:


    EDIT: ragionandoci un attimo su, questi metodi vengono chiamati continuamente da JTable per aggiornare la tabella o mi sbaglio?
    Sì li chiama la parte visuale di JTable.

    KuroKami69 ha scritto:


    quindi la loro chiamata starà in quello che sarà il file java di JTable giusto?
    Dovrei andare a verificare se è davvero JTable o la parte del Look&Feel di JTable.
    bene ti ringrazio per la risposta
    l'idea generale che mi ero fatto era più o meno corretta, quindi adesso sono molto più sereno
    ti ringrazio per i chiarimenti sul generics, e si mi vado a vedere lo static
    l'unica appunto, quella cosa che ho scritto sul columnindex sopra.
    mmmh al momento mi vengono altre domande ma non riguardano direttamente il modello base del tablemodel, ma la gestione di più tipi di veicoli alla selezione del radiobutton quindi magari prima faccio un codice funzionante solo per le auto e poi implemento anche le moto
    grazie mille per la risposta e chiedo scusa se ho quotato tutto il messaggio
  • Re: Jframe jtable

    Evito di allungare ulteriormente il messaggio precedente
    Automobile automobile = automobili.get(rowIndex);
    a questo non mi pare hai risposto, quindi te lo chiedo di nuovo anzi lo dico direttamente, più ci penso meno lo capisco questo. è chiaro che crei un oggetto automobile. è anche chiaro che usi la lista da te creata all'inizio. poi se ho ben inteso, avendo assegnato 3 costruttori alla lista, qua richiami l'n costruttore giusto? quindi nel mio caso, dove ho un numero di righe da visualizzare definito dall'utente, bhe dovrò fare la stessa cosa, faccio un ciclo for/while che avrà l'istruzione automobili.add(new automobile()); e la farà il numero di volte inserito dall'utente
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    ma quel rowindex devo ancora capire da dove lo tiri fuori
    poi sostanzialmente usi uno switch e dici "se columnindex vale 0 mi ritorni il metodo get marca e via dicendo" se non ha valori mi ritorni null.
    ok ma allora. non ho capito il funzionamento globale. non capisco dove poi i vari metodi vengono usati e la cosa mi manda nel pallone più totale.
    Scusa ma la spiegazione generale non è servita?? Il table model sta solo lì in attesa che "qualcuno" invochi i suoi metodi per ottenere le informazioni.
    I rowIndex/columnIndex non li "tiro" fuori io da nessuna parte! E' qualcun'altro (la parte visuale di JTable) che CHIAMA getValueAt (e gli altri metodi) passando di volta in volta TUTTI gli indici che ritiene validi secondo quanto il table model ha ESPOSTO all'esterno tramite getRowCount()/getColumnCount().

    Lo switch l'ho usato perché in quel punto del getValueAt è COMODO. Sono IO che ho scritto il table model che ho STABILITO che la prima colonna (indice 0) è la Marca, quindi:

    - il nome a colonna 0 è la marca { "Marca", "Modello", "Anno" }
    - il tipo a colonna 0 è String (La marca è una stringa) { String.class, String.class, Integer.class }
    - il valore a qualunque cella (xxxx, 0) è la marca perché faccio return automobile.getMarca().

    Insomma è tutto coerente in questo senso. A JTable e alla sua parte visuale tutto questo NON importa. JTable NON SA che io sto trattando oggetti Automobile. JTable "vede" solo informazioni generali sulla tabella e oggetti Object per le celle.

    E il return del null come "default" è per completare il getValueAt che deve comunque, in ogni caso, restituire qualcosa qualunque sia il "flusso" di esecuzione del getValueAt.

    Se dal getColumnCount() ho restituito 3 (perché nomiColonne.length vale 3 in quanto l'array dei nomi ha 3 nomi), è ragionevole pensare che la tabella visuale chiamerà il getValueAt SOLO con:

    getValueAt(xxxx, 0)
    oppure
    getValueAt(xxxx, 1)
    oppure
    getValueAt(xxxx, 2)

    e MAI es. getValueAt(xxxx, 3)

    Quindi è ragionevole pensare che quel return null NON debba mai accadere (ripeto, a meno che JTable sia "bacato" o peggio il mio table model sia stato scritto "male" e incoerente).
  • Re: Jframe jtable

    Si che è servita la tua spiegazione, ripeto, ho capito che jtable non sa nulla di com'è la tabella e che la costruisce andando a chiedere al tablemodel come diamine deve essere fatta la tabella e che valori deve avere.

    andbin ha scritto:


    KuroKami69 ha scritto:


    ma quel rowindex devo ancora capire da dove lo tiri fuori
    poi sostanzialmente usi uno switch e dici "se columnindex vale 0 mi ritorni il metodo get marca e via dicendo" se non ha valori mi ritorni null.
    ok ma allora. non ho capito il funzionamento globale. non capisco dove poi i vari metodi vengono usati e la cosa mi manda nel pallone più totale.
    Scusa ma la spiegazione generale non è servita?? Il table model sta solo lì in attesa che "qualcuno" invochi i suoi metodi per ottenere le informazioni.
    I rowIndex/columnIndex non li "tiro" fuori io da nessuna parte! E' qualcun'altro (la parte visuale di JTable) che CHIAMA getValueAt (e gli altri metodi) passando di volta in volta TUTTI gli indici che ritiene validi secondo quanto il table model ha ESPOSTO all'esterno tramite getRowCount()/getColumnCount().
    ...
    gli edit al posto li ho fatti tutti stanotte prima di dormire e prima che te rispondessi, quindi, di nuovo, la spiegazione mi è servita moltissimo, e difatti, prima ho scritto

    KuroKami69 ha scritto:


    ma quel rowindex devo ancora capire da dove lo tiri fuori
    poi sostanzialmente usi uno switch e dici "se columnindex vale 0 mi ritorni il metodo get marca e via dicendo" se non ha valori mi ritorni null.
    ok ma allora. non ho capito il funzionamento globale. non capisco dove poi i vari metodi vengono usati e la cosa mi manda nel pallone più totale.
    10 minuti dopo, forse, ho anche scritto però

    KuroKami69 ha scritto:


    EDIT: ragionandoci un attimo su, questi metodi vengono chiamati continuamente da JTable per aggiornare la tabella o mi sbaglio? quindi la loro chiamata starà in quello che sarà il file java di JTable giusto?
    tranquillo, ho capito il funzionamento, non hai perso tempo a scrivermi in questi giorni solo che essendo che ho delle lacune, anche come mentalità proprio, ed essendo questa una cosa totalmente nuova per me, faccio un attimo fatica a vederne il funzionamento nella mia mente. però come detto, ragionandoci un attimo su e ricordando quello che mi hai spiegato, anche se con qualche buco di mezzo, ho capito il funzionamento generale
  • Re: Jframe jtable

    Ok, allora per ora ho prodotto questo codice per il table model
    
    import javax.swing.*;
    import java.awt.*;
    import java.util.ArrayList;
    import javax.swing.table.AbstractTableModel;
    
    public class AutomobileTableModel extends AbstractTableModel
    {
    	JTable jt;
    	private static final String colonne[] = {"Marca", "Modello", "Stato", "Prezzo", "Tipo", "Colore", "KM", "Anno Imm.", "Scadenza Bollo", "Targa", "Posti", "Portiere", "Bagagliaio", "Cilindrata", "Cilindri", "Cavalli", "Peso/Potenza", "Alimentazione", "Consumo", "Trazione", "Cambio", "Marce", "Lunghezza", "Massa a Vuoto", "Altezza Car.", "Tettuccio"};
    	
    	private static final Class<?>[] tipiColonne = {String.class, String.class, String.class, Integer.class, String.class, String.class, Integer.class, String.class, Integer.class, String.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Double.class, String.class, Integer.class, String.class, Integer.class, Integer.class, Double.class, Integer.class, Double.class, String.class};
    	
    	private List<Automobile> automobili;
    	
    	for (int i = 0; 0 <= gerRowCount(); i++)
    	{
    		automobili.add(new Automobile());
    	}
    	
    	@Override
    	public int getRowCount(int i)
    	{
    		int r = i;
    		return r;
    	}
    	
    	/**************************************************************************************************************/
    	/*questo metodo qua è associato al seguente bottone, non facente parte di questo codice*/
    	/*l'ho messo solo adesso per far capire da dove getRowCount prende il valore                  */
    	/*************************************************************************************************************/
    	SpinnerModel jsm = new SpinnerNumberModel(10, 0, 1000, 5);
    		final JSpinner js = new JSpinner(jsm);
    		JButton b = new JButton("Visualizza");
    		b.addActionListener(new ActionListener()
    		{
    			public void actionPerformed(ActionEvent e)
    			{
    				Integer i = (Integer)js.getValue();
    				atm.getRowCount(i);
    			}
    		});
    		
    	/*****************************************************************************************************************/
    	/*****************************************************************************************************************/
    	
    	
    	@Override
    	public int getColumnCount()
    	{
    		return colonne.length;
    	}
    	
    	@Override
    	public Class<?> getColumnClass(int columnIndex)
    	{
    		 return tipiColonne[columnIndex];
    	}
    	
    	@Override
    	public String getColumnName (int columnIndex)
    	{
    		return colonne[columnIndex];
    	}
    	
    	@Override
    	public Object getValueAt(int rowIndex, int columnIndex)
    	{
    		Automobili automobile = automobili.get(rowIndex);
    		
    		switch(columnIndex)
    		{
    			case 0 = return automobile.getMarca();
    			case 1 = return automobile.getModello();
    			case 2 = return automobile.getStato();
    			case 3 = return automobile.getPrezzo();
    			case 4 = return automobile.getTipo();
    			case 5 = return automobile.getColore();
    			case 6 = return automobile.getKm();
    			case 7 = return automobile.getAnnoImmatricolazione();
    			case 8 = return automobile.getScadenzaBollo();
    			case 9 = return automobile.getTarga();
    			case 10 = return automobile.getPosti();
    			case 11 = return automobile.getPortiere();
    			case 12 = return automobile.getBagagliaio();
    			case 13 = return automobile.getCilindrata();
    			case 14 = return automobile.getCilindri();
    			case 15 = return automobile.getCavalli();
    			case 16 = return automobile.getRapportoPP();
    			case 17 = return automobile.getMotore();
    			case 18 = return automobile.getConsumo();
    			case 19 = return automobile.getTrazione();
    			case 20 = return automobile.getCambio();
    			case 21 = return automobile.getMarce();
    			case 22 = return automobile.getLunghezza();
    			case 23 = return automobile.getMassaVuoto();
    			case 24 = return automobile.getAltezzaTerra();
    			case 25 = return automobile.getTettuccio();
    			default return null;
    		}
    	}
    }
    
    com'è secondo voi? essenzialmente corretto?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Ok, allora per ora ho prodotto questo codice per il table model
    com'è secondo voi? essenzialmente corretto?
    No, parecchio parecchio sbagliato. E tra l'altro NON ti può compilare nemmeno a causa di svariati errori.
  • Re: Jframe jtable

    Ottimo devo dire. bhe è una partenza, ora non resta che rimboccarsi le maniche e sistemare quello che non va mmh
    grazie
    l'idea di creare la lista di auto nel tablemodel è essenzialmente sbagliata vero?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    l'idea di creare la lista di auto nel tablemodel è essenzialmente sbagliata vero?
    Sì, è sbagliata.
    Nel table model, in generale (e senza motivazioni ben precise):
    - non devi tenere riferimenti a JTable
    - non deve tenere altri componenti (come quel JButton)
    - non devi gestire listener di altri componenti (quel ActionListener)
    - non devi "creare" nuovi elementi

    In post ti ho fatto vedere come fare un aggiungiAutomobile.
    Ma puoi aggiungere tutti i metodi di "modifica" che vuoi.

    Es.
    rimuoviAutomobile(int index) (rimuove l'automobile all'indice)
    rimuoviAutomobili() (rimuove tutte le automobili)
    impostaAutomobili(List<Automobile> automobili) (re-imposta tutta la lista)
    ecc...

    Questi metodi di modifica sono per te che vuoi usare "programmaticamente" il table model. NON sono per JTable.
    In questi metodi bisogna fare sostanzialmente 2 cose:
    - aggiornare la struttura dati (ovviamente)
    - invocare il/i fireXXX di AbstractTableModel appropriato/i per notificare ai listener in modo accurato quella modifica apportata dal metodo.
Devi accedere o registrarti per scrivere nel forum
230 risposte