Newsgroup: it.comp.java
Titolo: modifiche ad un programma

Salve,
sto facendo un programma in java 7 swing con database derby che si trova 
qui :
http://tinyurl.com/qhmknnp
 
 
Per quanto riguarda la possibilità di mettere in relazione bisogni e 
risorse ho creato un campo nella tabella anagrafica in cui mettere 
manualmente gli id delle risorse che possono soddisfare i bisogni ma 
vorrei rendere più semplice per l'utente da un punto di vista grafico 
creare queste relazioni .Voi come fareste la schermata ?
 
Inoltre quando si crea un nuovo record o lo si modifica ho pensato di 
rimuovere le JTable e ricrearle. Si può lasciare così o conviene 
aggiungere nuove righe alle JTable?
 
grazie


Io agirei solo sul modello. Dipendentemente da com'e' costruito il 
TableModel, potrebbe essere conveniente vuotare il modello e tornarlo a 
riempire
Per frangenti analoghi, io mi sono costruito un table model sensibile 
alla chiave delle righe, ad esempio basato su un TreeSet, in modo che 
aggiungendo una riga decida se sostituirne una esistente di pari chiave 
ed ordini le righe automaticamente secondo la chiave.
Quacosa del tipo
interface KeyedTableModel<R extends Comparable<R>> extends TableModel
con
insertRow(R row)
insertRow(Collection<R> row)
e reimplementando i metodi previsti da TableModel, magari utilizzando la 
reflection sul tuo bean R.
Poiche' nei metodi di TableModel si parla spesso di rowIndex, sara' 
conveniente utilizzare un ArrayList<R> da ricostruire (semplicemente) 
con dal TreeSet ad ogni inserimento con:
list.clear();
list.addAll(treeset);
oppure aggiornare (un po' piu' complesso e forse meno efficiente) tramite:
treeSet.add(lastrow);
previousRow = treeSet.lower(lastrow);
list.add(previousRow==null?0:list.indexOf(previousRow)+1);
in modo che agli elementi di treeset corrisponda anche un indice 
ricavato da rowIndex = list.indexOf(row) e row = list.get(rowIndex).
Mentre i columnIndex potrebbero essere basati semplicemente su
Class<R> rowClass...;
List<Field> columns = Arrays.asList(rowClass.getFields());
quindi l'implementazione dei metodi di TableModel sara' ad esempio:
insertRow(R row) {
	int index = list.indexOf(row)
	if (treeset.add(row)) {
	  previousRow = treeSet.lower(lastrow);
	  list.add(previousRow==null?0:list.indexOf(previousRow)+1);
	} else {
	  list.remove(index);
	  list.add(index, row)
	}
}
insertRow(Collection<R> rows) {
	treeset.addAll(rows);
	list.clear();
	list.addAll(treeset);
}
boolean isCellEditable(int rowIndex, int columnIndex) {
	return getColumnClass(columnIndex).equals(String.class);
}
int getColumnCount() {
	return columns.size();
}
int getRowCount() {
	return list.size();
}
Class<?> getColumnClass(int columnIndex) {
	return columns.get(columnIndex).getType();
}
String getColumnName(int columnIndex) {
	return columns.get(columnIndex).getName();
}
Object getValueAt(int rowIndex, int columnIndex) {
	row = list.get(rowIndex);
	val = columns.get(columnIndex).get(row);
	return val;
}
void setValueAt(Object aValue, int rowIndex, int columnIndex) {
	row = list.get(rowIndex);
	columns.get(columnIndex).set(row, aValue);
}
 
Poi c'e' la complicazione del TableModelListener, alla cui 
implementazione ti rimando a quella della classe AbstractTableModel, di 
cui potresti utilizzare i metodi fireTable* e quelli relativi ai 
listener estendendo AbstractTableModel.