Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305

    Differenza tra ovverride metodo jtable e DefaultTableModel

    Salve sapreste dirmi la differenza tra l'ovveride del metodo iscelleditable nella jtable piuttosto che nel table model?
    codice:
    jTable2 = new javax.swing.JTable(){    public boolean isCellEditable(int r, int c)
        {
            if(c==5 || c==0)
            return false;
            else return true;
        }
    };
    String [] s= {
            "ID Customer", "Name", "Surname", "ZipCode", "E-Mail", "Score"
        };
    Object [][] rowdata = {};
    jTable2.setModel(new DefaultTableModel(rowdata,s){
        Class [] type=new Class[]{String.class,String.class,String.class,String.class,String.class,Double.class };
    
    
        public Class getColumnClass(int columnIndex) {
            return type [columnIndex];
        }
    });

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Salve sapreste dirmi la differenza tra l'ovveride del metodo iscelleditable nella jtable piuttosto che nel table model?
    Il isCellEditable in JTable è fatto così:

    codice:
        public boolean isCellEditable(int row, int column) {
            return getModel().isCellEditable(convertRowIndexToModel(row),
                                             convertColumnIndexToModel(column));
        }

    Alla fin fine usa isCellEditable del model ma ..... la differenza è concettuale sugli indici di riga/colonna. Al isCellEditable di JTable vanno passati indici nella "view", in pratica quello che vedi fisicamente nella tabella.

    Gli indici nella "view" e nel "model" possono non corrispondere. Per default (se non lo disabiliti), l'utente può trascinare/spostare le colonne, quindi gli indici di colonna possono essere differenti tra view e model. E da Java 6 è possibile applicare alla tabella un RowSorter, cosa che può scombinare gli indici di riga.

    In generale: in JTable gli indici che ricevi/passi sono nella "view", non nel "model".
    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
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da andbin Visualizza il messaggio

    In generale: in JTable gli indici che ricevi/passi sono nella "view", non nel "model".
    Per piacere non ho capito quest'ultima cosa potresti spiegarmela meglio. Grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Al di là del fatto che per fare l'override di isCellEditable() di JTable dovresti estendere JTable... cosa che nel 80% dei casi non si fa, visto che non ci sono esigenze particolari per ridefinire tutta la tabella.

    Le cose sono "diverse" e isCellEditable() di JTable non andrebbe mai ridefinito. Spiego le differenze e perchè non andrebbe ridefinito:

    Se si ridefinisce il metodo di JTable nel modo che hai fatto tu, si sta dicendo che quel particolare tipo di tabella avrà le colonne 0 e 5 non modificabili (e tutte le altre sì) indipendentemente dai dati che vi si trovano... ciò significa che se cambio il modello dei dati per quella tabella, le colonne 0 e 5 non saranno comunque modificabili, mentre tutte le altre sì... e chi ci dice che il nuovo modello avrà N colonne? E chi ci dice che i dati nella colonna 1 debbano obbligatoriamente essere modificabili? E' stato previsto un editor per le altre colonne? Capisci bene che non ha alcun senso... non è la tabella a decidere se una colonna è modificabile o meno: è il modello dei dati che la gestisce a deciderlo.

    Inoltre, se la tabella permette il riordino delle colonne (cioè, se l'utente ha facoltà di modificare l'ordine delle colonne), quella cosa lì non funziona più: è sufficiente che l'utente sposti la prima colonna in seconda posizione ed ecco che i dati in quella colonna diventano automaticamente modificabili. E non oso immaginare che tipo di dati ci possano finire dentro...

    No: non si deve fare l'override dei metodi di JTable (se non di alcuni, in particolari casi, quando proprio si ha la necessità di aggiungere delle features particolari). In special modo, non si deve fare l'override di quei metodi che influenzano il modello dei dati: è i modello a decidere quali dati esporre, quali rendere editabili e quali no, ecc, quindi l'override va fatto sul isCellEditable() del model.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    ok grazieeeeeeee sei stato davvero molto gentile.. te ne sono grato.
    comunque in ogni caso nel mio software le colonne non si potevano scambiare e la tabella non deve essere utilizzata per modelli di dati differenti.. quindi penso che lasciarlo cosi ai miei fini va bene..
    però ti sono davvero riconoscente perchè mi hai aiutato molto. ti ringrazio ancora

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Un ultima cosa, sapresti spiegarmi questa sintassi:[
    codice:
    jTable2=new javax.swing.JTable(){publicboolean isCellEditable(int r,int c){
            if(c==5|| c==0)
            returnfalse;
            elsereturntrue;
        }
    };

    Cioè per ridefinire un metodo non dovremmo ereditare la classe? Che sintassi è questa ?


  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Che sintassi è questa ?
    È una anonymous inner class che di fatto sta estendendo JTable, ridefinendo isCellEditable.

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    le colonne non si potevano scambiare
    Se hai fatto
    codice:
    tuaTabella.getTableHeader().setReorderingAllowed(false);

    allora sì, non sono riordinabili dall'utente.
    Ultima modifica di andbin; 14-02-2014 a 15:06
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quella è una anonymous class... una classe "senza un nome" a cui, quindi, non ci si può riferire per creare altre istanze. E' come se ci fosse una classe scritta così:


    codice:
    private class (nessun nome) extends JTable {
       @Override
       public boolean isCellEditable(int r, int c) {
          ...
       }
    }

    e che venisse creata una istanza di tale classe e assegnata alla variabile "jTable2".

    Io insisto nel dire che:

    1) Estendere JTable si può fare, ma andrebbe fatto solo in casi particolari
    2) Ridefinire isCellEditable() di JTable non è consigliabile quando è preferibile ridefinire il metodo nel TableModel... visto che un TableModel dovrebbe sempre esserci per le tabelle quando queste trattano dati non banali, per tutta una serie di ragioni e di problemi con i quali ti scontrerai indubbiamente procedendo in questo modo se non hai un tuo TableModel.... perchè se hai anche un tuo TableModel, allora non ha nessun senso ridefinire JTable per quel metodo: sarebbe solo una classe in più per niente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Cioè le classi anonime le definisco ad esempio con action listener che è un interfaccia. ma non sapevo si potesse fare anche con le classi !!
    Ho cancellato il primo periodo perchè penso di aver scritto una cavolata.
    Ultima modifica di linux_r; 14-02-2014 a 15:08

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    cioè non è ne una classe innestata , ne una classe anonima.
    anonymous inner class
    Quindi anonima e "innestata"
    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.