Newsgroup: it.comp.java
Titolo: JTable con prima colonna di scelta

Ho un problema.
Ho una tabella che mi viene popolata attraverso un model che legge da db. Il
tutto è semplice e funziona bene.
Ora il problema è che dovrei avere una colonna aggiuntiva iniziale che
rappresenti una possibile scelta (on/off).
Mi chiedo come si possa realizzare e soprattutto come poi possa legarlo ad
un pulsante.
Mi spiego meglio.
Clicco il pulsante --> devo eseguire una serie di operazioni sulle righe
selezionate.
E' realizzabile facilmente(o quanto meno, è realizzabile)?
Grazie
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 selezionate.
Devi lavorare sul model. Piů o meno:
class ModelEsteso extend Model {
   ...
   // la prima colonna č un boolean
   public Class getColumnClass(int columnIndex) {
      return (columnIndex == 0) ? Boolean.class :
super.getColumnClass(columnIndex + 1);
   }
   public int getColumnCount() {
      return super.getColumnCount() + 1
   }
   ... // e cosě via
   public ModelEsteso(...) {
      super(...);
      addTableModelListener(new TableModelListener() {
         public void tableChanged(TableModelEvent e) {
            if <č cambiato un valore nella prima colonna> {
               <fa quello che devi fare>
            }
         }
      });
   }
}
Spero di essere stato chiaro e soprattutto che sia quello che chiedevi.
Ciao.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Non è proprio quello che chiedevo.
La prima colonna non deriva dal database.
E' una colonna aggiuntiva per eseguire una selezione multipla a video.Non ha
nessun riscontro nei campi del database ne in lettura nè in scrittura.
Il mio tableModel legge su db e popola.
E' possibile inserire la colonna successivamente al popolamento?
Oppure qualè è il modo migliore da seguire per avere questa benedetta
colonna iniziale?
Cmq grazie per il tuo codice.


 E' possibile inserire la colonna successivamente al popolamento?
Non sono stato chiaro :-)
Io infatti intendevo:
- Model è il tuo model che legge da Db
- ModelEsteso è un model che *in più* ha una prima colonna con un JCheckBox
Se posti un po' di codice possiamo lavorarci su.


 Se posti un po' di codice possiamo lavorarci su.
E' una semplice classe che estende la AbstractTableModel:
TI spedisco il codice:
public int getColumnCount() {
		return cols;
	}
public int getRowCount() {
		return dati.size();
	}
public Object getValueAt(int row, int col) {
	Vector record = (Vector)dati.elementAt(row);
	return record.elementAt(col);
	  }
public String getColumnName(int col) {
  		if (titles[col]!=null)
  			return titles[col];
  		else
  			return "";
  	}
 
public void setCellEditable(boolean flag) {
		editable = flag;
	 }
public boolean isCellEditable(int row, int col) {
		if (col == getKeyColumn())
		   return false; // Key column not editable
		else
		   return editable;
	 }
 
 
 
public Class getColumnClass(int col) {
 
	 	int type;
			try {
				type = metadata.getColumnType(col+1);
			}
			catch (SQLException e) {
				return super.getColumnClass(col);
			}
			switch(type) {
				case Types.CHAR:
				case Types.VARCHAR:
				case Types.LONGVARCHAR:
					return String.class;
 
				case Types.BIT:
					return Boolean.class;
 
				case Types.TINYINT:
				case Types.SMALLINT:
				case Types.INTEGER:
					return Integer.class;
 
				case Types.BIGINT:
					return Long.class;
 
				case Types.FLOAT:
				case Types.DOUBLE:
					return Double.class;
 
				case Types.DATE:
					return java.sql.Date.class;
 
				default:
					return Object.class;
			}
	}
private void generaDati() throws MyTabellaException {
		 try {
 
			statement = conn.createStatement();
			resultSet = statement.executeQuery(sql);
			metadata = rs.getMetaData();
			cols = metadata.getColumnCount();
			titles = new String[cols];
			colsFromTables = new String[cols];
 
			for (int i=0; i<cols; i++) {
			   titles[i] = metadata.getColumnLabel(i+1);
 
			}
 
 
			while (rs.next()) {
			rows++;
			Vector nuovaRow = new Vector();
			for (int i = 1; i <= getColumnCount(); i++) {
				nuovaRow.addElement(rs.getObject(i));
				}
				dati.addElement(nuovaRow);
			}
			fireTableChanged(null); } catch (SQLException exp) {
		   System.out.println("Error in : " + sql);
		   exp.printStackTrace();


Roberta ha scritto:
[SNIP]
Immaginando che la tua classe si chiami Model, una soluzione potrebbe
essere: 
   public class ExtendedModel extends Model {
      private List flags;
      public static final String TITLE = "Seleziona";
      public ExtendedModel(...) {
         super(...);
         initFlags();
         addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
               <qui gestisci il click sulla prima colonna>
            }
         });
      }
      private void initFlags() {
         int n = getRowCount();
         flags = new ArrayList(n);
         for (int i = 0; i < n; i++) {
            flags.add(i, new Boolean(false));
         }
      }
      public boolean isCellEditable(int row, int col) {
         return (col == 0) ?
                      true :
                      super.isCellEditable(row, col - 1);
      }
      public int getColumnCount() {
         return super.getColumnCount() + 1;
      }
      public Object getValueAt(int row, int col) {
         return (col == 0) ?
                      flags.get(row) :
                      super.getValueAt(row, col - 1);
      }
      public String getColumnName(int col) {
         return (col == 0) ?
                      TITLE :
                      super.getColumnName(col - 1);
      }
      public Class getColumnClass(int col) {
         return (col == 0) ?
                      Boolean.class :
                      super.getColumnClass(col - 1);
      }
      public void setValueAt(Object value, int row, int col) {
         if (col == 0) {
            flags.set(row, value);
            fireTableCellUpdated(row, col);
         } else
            super.setValueAt(value, row, col - 1);
      }
   }
Nel tuo caso, inoltre, dovresti rendere (almeno) protected il metodo
generaDati() e andare in override con:
      protected void generaDati() throws MyTabellaException {
         super.generDati();
         initFlags();
      }
Questa č una soluzione.
Altre soluzioni possibili:
 - aggiungere una colonna direttamente alla JTable
 - modificare direttamente il source del tuo model ed aggiungergli una
colonna (perň la soluzione che ti ho proposto mi sembra piů pulita).
Spero di esserti stato d'aiuto.



Questa sera la proverň.
Mi sembra la soluzione migliore perchč non sporca il model classico che puň
essere usato.
Modificarlo non mi piace.
Modificare la jtable idem.
Grazie.



Funziona.
Grande!!!
Grazie.
Visto che sei stato molto gentile, oltre che competente, abuserei della tua
pazienza per chiederti due cosine:
E' possibile prendersi in automatico la descrizione delle colonne da db?
Riesco a trovare il nome ma non la descrizione.
E poi, molto piů interessante: facendo click in un campo, č possibile
evidenziare la selezione sull'intera riga(quindi un background di selezione
su tutta la riga)?
Grazie mille.
Robi


 Robi
Ri-prego.



http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTable.html#setRowSelectionAllowed(boolean)


 Cosa potrei aver settato?
Probabilmente, hai impostato setCellSelectionEnabled(true) oppure (che,
secondo la documentazione, è lo stesso) setColumnSelectionAllowed(true) *E*
setRowSelectionAllowed(true).
Anzi, dal momento che setRowSelectionAllowed(true) è il default, ti basta
aver impostato setColumnSelectionAllowed(true).
Fai delle prove (e leggi BENE la documentazione...).
Ciao.
P.S. io chiuderei il thread qui. Se hai ancora problemi con questa JTable,
puoi contattarmi per e-mail (l'indirizzo è valido, basta togliere NO_
_SPAM).
