Salve ragazzi ho un problema che mi sta assalendo da giorni.
Ho la necessità di realizzare un JTable che prenda i dati da un vettore.
Questo vettore contiene il risultato di una query effettuata sul database.
Ho utilizzato per creare la tablle un table model estendendo AbstractTableModel.
Purtroppo ho dei problemi di corretta visualizzazione dei dati. vi posto un po di codice
questo invece è il codice del metodo eseguiquery della classe Database.
il risultato che io ottengo è il seguente
[1, 10:10:59, 10:50:10, FBP, FBM]
[1, 10:15:59, 10:12:00, FBM, FBP]
[1, 10:10:59, 10:50:10, FBP, FBM]
[1, 10:15:59, 10:12:00, FBM, FBP]
[1, 10:10:59, 10:50:10, FBP, FBM]
[1, 10:15:59, 10:12:00, FBM, FBP]
[1, 10:10:59, 10:50:10, FBP, FBM]
ogni riga corrisponde a ciò che la tabella dovrebbe contenere, ogni elemento su una cella quindi una riga deve contenere
1 nella cella successiva 10:10:59 ecc ecc
invece io ottengo su ogni cella una cosa del genere [1, 10:10:59, 10:50:10, FBP, FBM] cioè quello che dovrei avere su una intera riga io lo ho in una cella
come posso risolvere questo problema
grazie a tutti
Ho la necessità di realizzare un JTable che prenda i dati da un vettore.
Questo vettore contiene il risultato di una query effettuata sul database.
Ho utilizzato per creare la tablle un table model estendendo AbstractTableModel.
Purtroppo ho dei problemi di corretta visualizzazione dei dati. vi posto un po di codice
Codice:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.Vector;
/**
* TableDemo is just like SimpleTableDemo, except that it
* uses a custom TableModel.
*/
public class TableDemo extends JPanel {
private boolean DEBUG = false;
static Database db;
public TableDemo() {
super(new GridLayout(1,0));
Vector v = new Vector();
v = db.eseguiQuery( "SELECT CODICE_LOCALITA, ORA_PARTENZA,ORA_ARRIVO_DA, archivionotearrivi.ABBREVIAZIONE, archivionotearrivi2.ABBREVIAZIONE FROM archiviopartenzeferiali, archiviolocalita, archivionotearrivi, archivionotearrivi2 WHERE codice_localita = archiviolocalita.codice and localita = 'Manfredonia'and codice_1nota = archivionotearrivi.codice and codice_2nota = archivionotearrivi2.codice ;" );
System.out.println(v);
MyTableModel dataModel = new MyTableModel(v);
// crea la tabella
JTable table = new JTable(dataModel);
JScrollPane scrollpane = new JScrollPane(table);
// aggiunge lo ScrollPane al pannello
add(scrollpane);
}
class MyTableModel extends AbstractTableModel {
Vector v = null;
// intestazioni delle colonne
String[] ColName = {"Titolo", "Autore",
"Editore", "Anno" ,"Cinque"};
public MyTableModel(Vector v) {
this.v = v; // inizializzato con il vettore
}
public int getColumnCount()
{ return ColName.length; }
public int getRowCount() {
// System.out.println("Stampo"+v.size());
return v.size();}
public String getColumnName(int col) {
return ColName[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) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col)
{
// nessuna cella editabile
return false;
}
public Object getValueAt(int row, int col) {
System.out.println(v.elementAt(row));
return v.elementAt(row);
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("TableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
TableDemo newContentPane = new TableDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
inizializzaDatabase();
createAndShowGUI();
}
});
}
private static void inizializzaDatabase() {
// TODO Auto-generated method stub
db = new Database("partenzearrivi");
if ( !db.connetti() ) {
System.out.println("Errore durante la connessione al database :(");
System.out.println( db.getErrore() );
System.exit(0);
}
else{
System.out.println("Mi sono connesso");
}
}//fi
}
questo invece è il codice del metodo eseguiquery della classe Database.
Codice:
public Vector eseguiQuery(String query) {
Vector v = null;
int colonne = 0;
try {
Statement stmt = db.createStatement(); // Creo lo Statement per l'esecuzione della query
ResultSet rs = stmt.executeQuery(query); // Ottengo il ResultSet dell'esecuzione della query
v = new Vector();
ResultSetMetaData rsmd = rs.getMetaData();
//rsmd = rs.getMetaData();
colonne = rsmd.getColumnCount();
//qualche modifica qui, in modo che si lavori su Vector piuttosto
//che su String[]
while(rs.next()) { // Creo il vettore risultato scorrendo tutto il ResultSet
Vector record = new Vector();
for (int i=0; i<colonne; i++) {
record.add(rs.getString(i+1));
}
v.add(record);
}
rs.close(); // Chiudo il ResultSet
stmt.close(); // Chiudo lo Statement
} catch (Exception e) { e.printStackTrace(); errore = e.getMessage(); }
return v;
}
il risultato che io ottengo è il seguente
[1, 10:10:59, 10:50:10, FBP, FBM]
[1, 10:15:59, 10:12:00, FBM, FBP]
[1, 10:10:59, 10:50:10, FBP, FBM]
[1, 10:15:59, 10:12:00, FBM, FBP]
[1, 10:10:59, 10:50:10, FBP, FBM]
[1, 10:15:59, 10:12:00, FBM, FBP]
[1, 10:10:59, 10:50:10, FBP, FBM]
ogni riga corrisponde a ciò che la tabella dovrebbe contenere, ogni elemento su una cella quindi una riga deve contenere
1 nella cella successiva 10:10:59 ecc ecc
invece io ottengo su ogni cella una cosa del genere [1, 10:10:59, 10:50:10, FBP, FBM] cioè quello che dovrei avere su una intera riga io lo ho in una cella
come posso risolvere questo problema
grazie a tutti