Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Jtable Sql

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    158

    Jtable Sql

    Ragazzi ho scritto la mia applicazione con netbeans,ora mi è stato suggerito di imparare a scriverla tutto a mano e vi chiederò molti aiuti,abbiate pazienza.

    1 punto ostico JTable

    volevo inizializzare la mia Jtable con i dati del mio database catturati tramite un VECTOR ma non volevo utilizzare la DefaultTableModel perchè non è tanto personalizzabile,allora ho scelto di utilizzare la Classe AbstractTableModel, ma sarà la stanchezza ma non riesco tanto a capirci una H.

    vi posto il mio codice

    codice:
     try {
                 String sql=  "select * from Buste";
                 pst = conn.prepareStatement(sql);
                 rs = pst.executeQuery();
                 //tabella_busta.setModel(DbUtils.resultSetToTableModel(rs));//Aggiungere la libreria (rs2xml.jar) NON LA VOGLIO USARE VOGLIO PERSONALIZZARE LA JTABLE COME VOGLIO
                 
               
                 
                 
         		
         	
         		tabella_busta = new JTable(new AbstractTableModel() // tabella con un table model custom
                {
                    // sorgente dati
                    private String  [] head = {"Codice Busta","Prezzo Costo","Prezzo Vendita","Data","Operatore"};
                    
                    
                  
    				Vector source_data = new Vector();
    				
                    
                    
                    //QUESTA PARTE ERA LEGATA A UNA OBJECT [] []
                    //M IO VOGLIO USARE UN VECTOR
    
                    public int getRowCount() { return source_data.size();}
                    public int getColumnCount(){ return head.length; }
                    public String getColumnName(int column) { return head[column]; }
                    
                    public Object getValueAt(int rowIndex, int columnIndex)
                    {
                        return source_data.get(getRowCount())//[rowIndex][columnIndex];
                    }
    
                    // rendi editabile solo le celle con il colore
                    public boolean isCellEditable(int rowIndex, int columnIndex)
                    {
                        return columnIndex == 1;
                    }

    Qualcuno ha qualche esempio? non riesco a trovare niente che fa al caso mio

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Jtable Sql

    Originariamente inviato da Nio74
    volevo inizializzare la mia Jtable con i dati del mio database catturati tramite un VECTOR ma non volevo utilizzare la DefaultTableModel perchè non è tanto personalizzabile,allora ho scelto di utilizzare la Classe AbstractTableModel
    Innanzitutto se estendi AbstractTableModel sarebbe meglio se la classe la definisci a parte. Nessuno vieta di farla con una anonymous inner class ma ... almeno sarebbe un po' più "pulito", visto che ci sono da sovrascrivere un po' di metodi.

    Tornando al AbstractTableModel, per la struttura dati puoi fare assolutamente come vuoi. Il tuo table model potrebbe avere una struttura Object[][], un TuoTipo[], un Vector<TuoTipo>, ecc....
    All'esterno, per JTable in particolare, è del tutto indifferente. L'importante è che il tuo table model "risponda" correttamente alle richieste dai metodi di TableModel ("quante righe ci sono?", "quante colonne ci sono?", "dammi il valore alla cella y,x", ecc...).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    158
    Mi consigli di farla come classe interna alla mia o esterna?

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    158
    Sto diventando matto,ho cominciato con il piu semlice il TebleDefault,poi volevo provare a farne uno mio ma se non riesco neanche a capire quello normale puoi figurarti,ma piano piano spero con il vostro aiuto ci riuscirò.


    sono a questo punto ma mi da errore che non Il Vector non è String


    codice:
     try {
                 String sql=  "select * from Buste";
                 pst = conn.prepareStatement(sql);
                 rs = pst.executeQuery();
                 
                    	    
                 ResultSetMetaData rsmd = rs.getMetaData();
                 int numColonne = rsmd.getColumnCount();
                 Vector nomeColonne = new Vector();
                 for (int nr=0; nr<numColonne; nr++)
                        nomeColonne.add(rsmd.getColumnName(nr+1));
                 Vector <Vector> datiRighe = new Vector <Vector>();
                 while (rs.next()){
                        Vector riga = new Vector(); 
                        for (int nr=0; nr<numColonne; nr++) {
                            riga.add(String.valueOf(rs.getObject(nr+1)));//HO PROVATO A FARE IL CASTING
                        }
                 datiRighe.add(riga);
                 }
    
                    	             
                     
    				tabella_busta=new JTable(nomeColonne,datiRighe);
    				JScrollPane p = new JScrollPane(tabella_busta);
    				
    				left.add(p);//La aggingo al pannello di sinistra
    				
                    
                    
                      		
             } catch (SQLException e) {
                 JOptionPane.showMessageDialog(null, e);
                 
             }




    ERRORE:

    Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Vector
    at javax.swing.table.DefaultTableModel.justifyRows(De faultTableModel.java:268)
    at javax.swing.table.DefaultTableModel.setDataVector( DefaultTableModel.java:224)
    at javax.swing.table.DefaultTableModel.<init>(Default TableModel.java:159)
    at javax.swing.JTable.<init>(JTable.java:668)
    at Frame1.initComponents(Frame1.java:120)
    at Frame1.<init>(Frame1.java:42)
    at Frame1.main(Frame1.java:138)

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Nio74
    codice:
    tabella_busta=new JTable(nomeColonne,datiRighe);
    Il costruttore da usare è:

    public JTable(Vector rowData, Vector columnNames)

    Cosa noti?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    158
    Vero l'avevo invertito ora non mi da nessun errore ma non mi compare la tabella





    Posto tutto il codice

    codice:
    import java.awt.*;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Vector;
    
    import javax.swing.*;
    import javax.swing.border.TitledBorder;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    import javax.swing.table.TableColumnModel;
    import javax.swing.table.TableModel;
    
    import net.proteanit.sql.DbUtils;
    
    public class Frame1 extends javax.swing.JFrame{
    	
    	
    	Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pst = null; 
    	
        private JPanel  left,right;
        public JTable tabella_busta;
        private JButton mostra;
    	
        private JLabel  operatore;  
    
    	public Frame1(){
    		
    		super ("Riparazione Orologi");
    		this.setSize(new Dimension(1027,768));
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		this.setLayout(new BorderLayout());
    		conn = ConnessioneDb.connectDb();
    		
    
    		initComponents();
    		//Update_table();
    		
    		
    		
    		
    		
    		
    		
    		
    	}
    	
    	private void Update_table(){
            try {
                String sql=  "select * from Buste";
                pst = conn.prepareStatement(sql);
                rs = pst.executeQuery();
                tabella_busta.setModel(DbUtils.resultSetToTableModel(rs));//Aggiungere la libreria (rs2xml.jar)
                pst.close();
                rs.close();
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, e);
                
            }
    	}
    	
    	private void initComponents() {
    		BorderLayout layout = new BorderLayout();
    		//pannello di sinistra
    		left = new JPanel();
    		TitledBorder titoloPLeft = new TitledBorder("Operazioni Buste");
    		left.setLayout(layout);
    		left.setBorder(titoloPLeft);
    		left.setPreferredSize(new Dimension(700,500));
    		//pannello di destra
    		right = new JPanel();
    		TitledBorder titoloPRight = new TitledBorder("Statistiche Buste");
    		right.setLayout(layout);
    		right.setBorder(titoloPRight);
    		
    		
    		//Bottoni
    		mostra = new JButton("Mostra");
    		mostra.setSize(100,20);
    		//right.add(mostra);
    		
    		//Metto i Pannelli nel contenitore root
    		this.add(left, BorderLayout.LINE_START);
    		this.add(right,BorderLayout.WEST);
    
    		
    		
    		
    		//Creo una Jtable Per le buste
    		
    		
    		 try {
                 String sql=  "select * from Buste";
                 pst = conn.prepareStatement(sql);
                 rs = pst.executeQuery();
                 
                    	    
                 ResultSetMetaData rsmd = rs.getMetaData();
                 int numColonne = rsmd.getColumnCount();
                 Vector nomeColonne = new Vector();
                 for (int nr=0; nr<numColonne; nr++)
                        nomeColonne.add(rsmd.getColumnName(nr+1));
                 Vector <Vector> datiRighe = new Vector <Vector>();
                 while (rs.next()){
                        Vector<String> riga = new Vector<String>(); 
                        for (int nr=0; nr<numColonne; nr++) {
                            riga.add(String.valueOf(rs.getObject(nr+1)));//HO PROVATO A FARE IL CASTING
                        }
                 datiRighe.add(riga);
                 }
    
                    	             
                     
    				tabella_busta=new JTable(datiRighe,nomeColonne);
    				JScrollPane p = new JScrollPane(tabella_busta);
    				
    				left.add(p);//La aggingo al pannello di sinistra
    				
                    
                    
                      		
             } catch (SQLException e) {
                 JOptionPane.showMessageDialog(null, e);
                 
             }
    		
    		
    
    		
    	}
    	public static void main(String[] args) {
    	new Frame1().setVisible(true);;
    	
    		
    		
    		
    	}
    }

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Nio74
    codice:
    //Metto i Pannelli nel contenitore root
    this.add(left, BorderLayout.LINE_START);
    this.add(right,BorderLayout.WEST);
    Se i contenitori hanno orientamento left-to-right (che è il caso normale, a parte casi particolari con le lingue arabe ecc...), LINE_START è sostanzialmente uguale a WEST.

    Non mischiare mai l'uso delle costanti di posizionamento "relative" e "assolute".
    NORTH, SOUTH, ecc... sono "assoluti", sono sempre dove ci si aspetta (mi pare ovvio, no?, il nord è il nord, l'est è il est!).
    PAGE_START, PAGE_END, LINE_START, ecc... sono "relativi", dipendono dall'orientamento LTR/RTL e se top-to-bottom (o il contrario).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    158

    ero esasperato almeno ora ho una base che sono sicuro che funzioni

    Originariamente inviato


    da andbin

    Se i contenitori hanno orientamento left-to-right (che è il caso normale, a parte casi particolari con le lingue arabe ecc...), LINE_START è sostanzialmente uguale a WEST.

    Non mischiare mai l'uso delle costanti di posizionamento "relative" e "assolute".
    NORTH, SOUTH, ecc... sono "assoluti", sono sempre dove ci si aspetta (mi pare ovvio, no?, il nord è il nord, l'est è il est!).
    PAGE_START, PAGE_END, LINE_START, ecc... sono "relativi", dipendono dall'orientamento LTR/RTL e se top-to-bottom (o il contrario).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.