Salve.Come devo fare per rendere non editabili le celle di JTable?
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).Originariamente inviato da tcc
Salve.Come devo fare per rendere non editabili le celle di JTable?
Quindi quale table model stai usando? Uno "tuo"??
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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; } }
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'.Originariamente inviato da tcc
Non ho usato nessun modello.
codice:JTable table = new JTable(cells,columnNames);
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Quindi posso fare direttamente che Table estende DefaultTableModel facendo l' override del metodo?
Inoltre se posso farlo che devom inserire nel metodo isCellEditable()?
Originariamente inviato da tcc
Quindi posso fare direttamente che Table estende DefaultTableModel facendo l' override del metodo?Poi semplicemente: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 } }
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet