PDA

Visualizza la versione completa : [JAVA] JTable problemi vari


cat82
16-12-2005, 17:26
Ciao raga,
qualcuno sa come fare per:
- creare un campo check box per i valori booleani in una determinata colonna di una JTable
- lasciare la possibilità di modificare solo i valori di una determinata colonna mentre le altre colonne bloccarle alla modifica
- Impostare dimensioni fisse ogni colonna diversa.
Ciauz e grazie anticipate

unomichisiada
16-12-2005, 20:28
Originariamente inviato da cat82
Ciao raga,
qualcuno sa come fare per:
- creare un campo check box per i valori booleani in una determinata colonna di una JTable
- lasciare la possibilità di modificare solo i valori di una determinata colonna mentre le altre colonne bloccarle alla modifica
- Impostare dimensioni fisse ogni colonna diversa.
Ciauz e grazie anticipate

Per il primo punto sovrascrivi il metodo getColumnClass del TableModel associato alla JTable ritornando boolean quando il valore della colonna è uguale a quello dove vuoi i checkbox, avrai automaticamente il comportamente che cerchi perchè il renderer di default per quel tipo di dato è proprio un checkbox

-per il secondo sovrascrivi il metodo setEditable della stessa classe ritornando true per le colonne (o per lecelle) che vuoi editabili e false per le altre

-non mi è mai servito ma credo tu debba usare qualche metodo del tableheader associato alla jtable

cat82
19-12-2005, 09:05
Grazie per l'aiuto unomichisiada,
ma nn ho capito molto di cosa devo fare, puoi essere cosi cortese da farmi capire meglio magari con qualche riga di codice o qualche link dove posso trovare qualche esempio il da farsi.
Ciao e grazie

unomichisiada
19-12-2005, 13:45
Originariamente inviato da cat82
Grazie per l'aiuto unomichisiada,
ma nn ho capito molto di cosa devo fare, puoi essere cosi cortese da farmi capire meglio magari con qualche riga di codice o qualche link dove posso trovare qualche esempio il da farsi.
Ciao e grazie
Al momento non ho righe di codice da postarti perchè non sono a casa e non le scrivo sul momento perchè ti potrei scrivere rob che non compila, comunque a grandi linee ti posso dire che una JTable (così come tutti i componenti JFC) ha associato un modello che racchiude diciamo il comportamento ed i dati associati al controllo.Per la JTable questo modello si chiama in generale TableModel (che è l'interfaccia base) ed ogni JTable istanzita ha associato un DefaultTableModel che è una classe con l'implementazione di default di questa interfaccia (se non ne hai capito nulla è meglio che ti studi classi e interfacce in java primadi proseguire).Ebbene tu hai la possibilità di ridefinire i metodi di una classe come sai o dovresti sapere, ti basta creare un nuovo oggetto DefaultTableModel, ridefinire al volo i metodi che ti ho detto e poi usare l'apposito metodo di Jtable per far si che il suo modello diventi quello che hai appena creato.


DefaultTableModel model = new DefaultTableModel()
{
boolean isCelleditable(int row,int col)
{
if(col == 5)
return true
else
...
}
//altri metodi
};
table.setModel(model);

Ripeto prendi questocodice cone le pinze perchè non è testato e la memoria potrebeb giocarmi brutti scherzi

Tral'altro nel post precedente ti ho detto di sovrascrivere setEditable sbagliando, proprio a causa di questi brutti scherzi :fagiano:

cat82
19-12-2005, 16:46
ho creato la seguente classe:

public class PersonalizzaJTable extends AbstractTableModel {


private String[] colonne;
private Object[][] cells;

/** Creates a new instance of PersonalizzaJTable */
public PersonalizzaJTable(Object[][] cells,String[] colonne) {
this.colonne=colonne;
this.cells=cells;
}

public int getColumnCount() {
System.out.println("colonne.length : "+colonne.length);
return colonne.length;

}

public int getRowCount() {
System.out.println("cells.length : "+cells.length);
return cells.length;
}

public String getColumnName(int col) {
return colonne[col];

}

public Object getValueAt(int row, int col) {
System.out.println("row "+row);
System.out.println("col "+col);
return cells[row][col];
}



/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
System.out.println("c "+c);
return getValueAt(0, c).getClass();
}
}

e la inizializzo cosi nella mia classe principale:

Tabella = new JTable(new PersonalizzaJTable(cells,columnNames));

Ho un unico problema.Prima con il DefaultTableModel avevo il metodo: .setDataVector che mi permetteva di caricare all'interno della JTable i miei dati modificati caricati da una tabella in un db.
Ora se cerco di caricare altri dati nella JTable rivedo sempre quelli vecchi.
Cosa e come popsso fare?
Grazie
:dhò:

cat82
19-12-2005, 17:53
Ho risolto questo problema,
ma come posso fare per nn rendere editabili le colonne tranne che quelle booleane che nn ci riesco?

unomichisiada
19-12-2005, 20:09
Originariamente inviato da cat82
Ho risolto questo problema,
ma come posso fare per nn rendere editabili le colonne tranne che quelle booleane che nn ci riesco?
all'interno di PersonalizzaJTable socrascrivi anche isCellEditable, metodo cui vengono passati come parametri la riga e la colonna della cella in esame, ti basta controllare il valore di col e quando corrisponde a quello delle cell booleane ritorni false.

cat82
20-12-2005, 09:03
Ok fatto e funziona.Per usare però il metodo .setDataVector() ho dovuto cambiare la classe estesa con DefaultTableModel visto che estende AbstarctableModel.
Ora però nn riesco a dirgli di selezionare l'intera riga e nn la singola cella.
C'è un modo per fare cio?
Per le dimensioni delle singole colonne ho provato a cercare qualche metodo per fare cio ma niente.Suggerimenti?
Ciao e grazie mille

cat82
20-12-2005, 09:16
Ho risolto il problema della dimensione delle colonne ma persiste l'errore di selezionare solo una singola cella.
Quando usavo il DefaultTableModel avevo implementatato il seguente:

if (gestioneRigheJTable) { // true by default
ListSelectionModel rowSM = Tabella.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
//Ignore extra messages.
if (e.getValueIsAdjusting()) return;

ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
selectedRow=-1;
System.out.println("No rows are selected.");
} else {
selectedRow = lsm.getMinSelectionIndex();
VisualizzaRecordSelezionato(selectedRow);
System.out.println("Row " + selectedRow + " is now selected.");
}
}
});
} else {
Tabella.setRowSelectionAllowed(false);
}

Ora però nn funziona +.Qualcuno sa il perchè.Lo devo inserire nella mia classe PersonalizzaJTable? E se si come posso fare.
Grazie :dhò:

cat82
20-12-2005, 09:27
Ok risolto anche questo, ciao a tutti, a fra poco tanto mi verranno fuori sicuramente problemi

Loading