Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313

    [JAVA]JTable celle non editabili

    Salve.Come devo fare per rendere non editabili le celle di JTable?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA]JTable celle non editabili

    Originariamente inviato da tcc
    Salve.Come devo fare per rendere non editabili le celle di JTable?
    È il table model che indica all'esterno se una cella è editabile (isCellEditable() di TableModel).
    Quindi quale table model stai usando? Uno "tuo"??
    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
    May 2004
    Messaggi
    313
    Non ho usato nessun modello,ho semplicemente istanziato l'oggetto JTable,riporto sotto il codice :

    codice:
    public class Table {
        
        public Table(){
            
        }     
        
        public JPanel createTable(ResultSet rs) throws SQLException{
            JPanel panelTable = new JPanel();
            Object[] columnNames = this.getCol(rs);
            int countColumn = rs.getMetaData().getColumnCount();
            System.out.println("numero colonne : "+countColumn);
            int countRow = this.countRow(rs);
            System.out.println("numero righe : "+countRow);
            Object[][] cells = this.getCells(rs);        
            JTable table = new JTable(cells,columnNames);
            table.setRowHeight(20);
            JScrollPane scrollPane = new JScrollPane(); 
            scrollPane.setPreferredSize(new Dimension(1020,300));
            scrollPane.getViewport().add(table);
            panelTable.add(scrollPane);
            
            return panelTable;
        }
       
        
        
        public Object [] getCol(ResultSet rs){
            int countColumn=0;
            Object[] columnNames = null;
            try {
                rs.first();
                countColumn = rs.getMetaData().getColumnCount();
                columnNames = new Object[countColumn];
                for(int i=0;i<countColumn;i++){
                    columnNames[i] = (rs.getMetaData().getColumnLabel(i+1));
                }
            } catch (SQLException ex) {
                Logger.getLogger(Table.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            return columnNames;
        }
        
        public Object[][]  getCells(ResultSet rs){
            int countRow = 0;
            int countColumn= 0 ;
            int i;
            Object[][] cells = null;
            try {
              countColumn = rs.getMetaData().getColumnCount();
              countRow = this.countRow(rs);
              cells = new Object [countRow][countColumn];
              i=0;
              if(rs.first()){//There is only row
                  for (int j = 0; j < countColumn; j++) {
                      
                       
                       cells [i][j] = rs.getString(j+1) ;
                       
                       
                   }
                  i++;
              }       
              
              
              while(rs.next()) {
                   for (int j = 0; j < countColumn; j++) {
                       cells [i][j] = rs.getString(j+1);
                   }                
                  i++; 
              }
            } catch (SQLException ex) {
                Logger.getLogger(Table.class.getName()).log(Level.SEVERE, null, ex);
          }
            
            
           
            return cells;
        }
        
      public int countRow(ResultSet rs) {
          
          int countRow=0;
           
            try {
                if(rs.first()){//There is only row
                 countRow++;   
                }           
                while (rs.next()) {
                    countRow++;
                }
            } catch (SQLException ex) {
                Logger.getLogger(Table.class.getName()).log(Level.SEVERE, null, ex);
            }
           return countRow;
          
      }
    
        
    
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    Non ho usato nessun modello.

    codice:
            JTable table = new JTable(cells,columnNames);
    Tu no, non hai creato/usato alcun model ma in JTable c'è comunque! Quel costruttore a cui passi direttamente i dati semplicemente invoca l'altro costruttore di JTable a cui passa un nuovo model creato "al volo" (definito con una anonymous class che estende AbstractTableModel) in cui isCellEditable() ritorna sempre 'true'.

    Devi cambiare un po' le cose .... o definisci un "tuo" table model che estende AbstractTableModel (e qui puoi usare internamente la struttura dati che più preferisci), o estendi DefaultTableModel facendo solo l'override di isCellEditable(). Nota che in DefaultTableModel la struttura dei dati è un Vector di Vector. Ma un DefaultTableModel ha il costruttore con gli stessi argomenti che stavi passando a JTable.
    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
    May 2004
    Messaggi
    313
    Quindi posso fare direttamente che Table estende DefaultTableModel facendo l' override del metodo?

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Inoltre se posso farlo che devom inserire nel metodo isCellEditable()?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    Quindi posso fare direttamente che Table estende DefaultTableModel facendo l' override del metodo?
    codice:
    public class MioTableModel extends DefaultTableModel {
        public MioTableModel(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
        }
    
        public boolean isCellEditable(int row, int column) {
            return false;   // nessuna cella è editabile
        }
    }
    Poi semplicemente:

    JTable table = new JTable(new MioTableModel(cells,columnNames));

    Lo svantaggio è che comunque il tuo è un DefaultTableModel, che mantiene i dati in un Vector di Vector, quindi certamente più costoso del AbstractTableModel fatto al volo da JTable.
    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.