Devo creare un frame che serva come interfaccia lato client per un sistema di login, che contenga fra le altre cose una tabella, da riempire con i dati provenienti da un file xml.
Il file xml contiene una lista di dati, (per esempio nome utente Gianni, attributi possibile: impiegato, magazziniere, ecc) il dato e' formato da tre campi:
- tipo di dato (nomeutente od attributoutente);
- path dove e' salvato il certificato digitale a cui si riferisce il dato, infatti al server spedisco il certificato in allegato alla richiesta in xml;
L'utente deve avere quindi la possibilita' di scegliere (ma non con un processo di mutua esclusione) per ogni nomeutente presente tutti i tipi di attributi che vuole.
Per la lettura dal file xml ho usato il Dom parser, i dati poi li ho salvati cosi:
arraycert1[0] = dato;
arraycert1[1] = path;
vectcert1.add(arrayvect1);
Questa operazione e' inserita all'interno di un ciclo for che ricerca all'interno del documento. Ho pensato che fosse piu' agevole avere un vettore che contenesse tutti gli array che contengono i nomi utenti, ed un altro che contenesse gli array che contengono gli attributi, se so la lunghezza dei due vettori so anche il numero di utenti attuale ed il numero di attributi. Ogni elemento del vettore vectcert1 contiene quindi due campi al suo interno.
Un vettore di array mi pareva fosse la cosa piu' logica da usare. O e' preferibile fare una classe del genere:
class Datacontainer
{
String Value;
String Path;
}
e poi all'interno del ciclo for che legge dal documento fare:
Datacontainer[] tizio = new Datacontainer[];
tizio[] = dato;
..
vectcert1.add(tizio);
In questo caso devo implementare i metodi di lettura all'interno della classe Datacontainer, oppure uso quelli dei vettori?
Quando ho letto questi dati, cerco di salvarli in una tabella a 3 colonne, in cui ogni riga e' composta da i due campi di ogni elemento ed un checkbutton.
Nel costruirla pensavo di fare cosi' class Myatable extends AbstractTableModel
{
private String[] columnNames = {"Identity", "Attribute", "Selection"};
private Object[][] data = {};
Pero' ho un problema, cioe' che se cerco di riempire data con due for, ma mi dice illegal start of expression se uso questo codice
for (int i=0; i<vectcert1.size(), i++) {
for (int l=0; l<vectcert2.size(), i++) {
private Object[i][l] data = {vectcert1[i].., vectcert2[l], Boolean(false)};
Usando, all'interno della classe che contiene il Frame questa sintassi per la costruzione della tabella:
//costruction of the panel of identity
JTable table = new JTable(new Myatable());
table.setPreferredScrollableViewportSize(new Dimension(200, 30));
class Myatable extends AbstractTableModel
{
private String[] columnNames = {"Identity", "Attribute", "Selection"};
private Object[][] data = {};
public int getColumnCount()
{
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int c)
{
return getValueAt(0, c).getClass();
}
}
//add the table to a scrollpanel
JScrollPane jsp = new JScrollPane(table);
table.setPreferredScrollableViewportSize(new Dimension(200, 50));
Il codice e' in inglese xke' non posso usare l'italiano.
Il frame contiene anche un bottone a cui e' associato un listener che fra le altre cose fa un check su tutte le righe della tabella ed estrae il path del certificato su quelle in cui trova che il checkbutton e' stato clicckato.
nrow = table.getRowCount();
for (int e = 0; e<nrow; e++)
{
boolean test = table.getValueAt(e, 2);
if (test == true)
{
Util_client.addSampleCertificates(req, vectcert2[e].getPath());
}
E qui ho l'altro errore in fase di compilazione, quando invoco la procedura che mi estrae il valore di una cella io devo passare un numero, ma siccome questo numero deve variare ho messo la variabile e che stride con la funzione dichiarata, che ha due variabili di tipo int. Come posso a far capire al programma che quando passo al metodo getValueAt, passo il valore numerico di e, non la lettera.
}