Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [Java] Problema JTable

  1. #1

    [Java] Problema JTable

    Ciao raga

    ho un problema con le JTable, vi spiego subito.

    allora io creo una tabella in questo modo:

    codice:
    ResultSet rs = stat.executeQuery(query);
    //			crea la tabella con il modello 
    ModelloTabella model= new ModelloTabella(rs);
    table = new JTable(model);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    table.setRowSorter(new TableRowSorter (model));
    
    //			aggiunge la tabella allo scrollpane
    scrollpane = new JScrollPane(table);
    ora se effettuo modifice al tatabase e associo la tabella ad un altro modello con numero di righe inferiore in questo modo:

    codice:
    Statement st1 = con.createStatement();
    ResultSet rs1 = st1.executeQuery(query);
    ModelloTabella model1= new ModelloTabella(rs1);
    table.setModel(model1);
    la tabbella risultante visualizza il risultato nuovo , ma contiene righe bianche (campi vuoti) pari al numero di righe del vecchio model.

    Penso che questo problema sia dato da .setModel() , come faccio a non far uscire quelle righe bianche?

    Spero di essere stato chiaro, e vi ringrazio per le risposte !

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

    Re: [Java] Problema JTable

    Originariamente inviato da fcorsa
    Penso che questo problema sia dato da .setModel()
    No. Probabilmente è un problema del tuo model.

    Comunque assegnare ad ogni query un nuovo model è sì una soluzione ma esiste anche l'altra soluzione di mantenere sempre lo stesso oggetto model e aggiornare solo la sua struttura dati interna e poi notificare le modifiche.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ciao andbin

    mantenere sempre lo stesso oggetto model e aggiornare solo la sua struttura dati interna e poi notificare le modifiche.
    potresti farmi un esempio ?

    comunque questo e il mio model :

    codice:
    public class ModelloTabella extends AbstractTableModel {
    	
    	public ModelloTabella(ResultSet aResultset){
    		rs = aResultset;
    		
    		try{
    			
    			rsmd = rs.getMetaData();
    		}catch	(SQLException e){e.printStackTrace();}
    		}
    	public String getColumnName(int c){
    		try{
    			//metodo che setta i nomi delle colonne
    			String str=rsmd.getColumnName(c+1);
    			
    			if (str.equals("id_macchina"))str ="N° Macchina";
    			if (str.equals("nome"))str ="Macchina";
    			if (str.equals("descrizione"))str ="Descrizione";
    			if (str.equals("Fascia_max"))str ="Fascia Max";
    									
    			return str;
    		}catch(SQLException e){e.printStackTrace(); return "";}
    	}
    	public int getColumnCount() {
    		// metodo che conta le colonne
    		try{
    			return rsmd.getColumnCount();
    		}catch(SQLException e){e.printStackTrace(); return 0;}
    	}
    
    	public int getRowCount() {
    		//metodo che conta le righe
    		try{
    			rs.last();
    			return rs.getRow();
    		}catch(SQLException e){e.printStackTrace();return 0;}
    	}
    
    	public Object getValueAt(int r, int c) {
    		// metodo che aggiunge l'oggetto alla tabella
    		try{
    			rs.absolute(r+1);
    			return rs.getObject(c+1);
    		}catch(SQLException e){e.printStackTrace();return null;}
    	}
    	private ResultSet rs;
    	private ResultSetMetaData rsmd;
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fcorsa
    potresti farmi un esempio ?
    Esempio completo no ... sarebbe un po' lungo.
    Comunque nulla ti vieta di mettere nel tuo model un metodo es. setResultSet(ResultSet rs) in modo che si "aggiorni" con il nuovo result set. Questo comunque comporta poi la "notifica" delle modifiche con i fireXXX di AbstractTableModel

    Dal codice postato deduco che usi i result set "scrollabili". Motivo per cui i dati vengono presi direttamente, quando/dove serve, dal result set e nel tuo model non c'è bisogno di una apposita "struttura dati".

    Comunque io leggerei inizialmente numero di righe/colonne e li terrei in variabili di istanza, per restituirli senza particolari problemi dai getColumnCount/getRowCount.

    Fatte queste premesse comunque mi sembra strano quello che dicevi "contiene righe bianche (campi vuoti) pari al numero di righe del vecchio model". Il model si basa su ciò che fornisce il ResultSet. Se il result set dice che ci sono N righe ... quelle saranno nella tabella.
    A meno che ci sia altro che ora mi sfugge .... (e che magari dipende da altro)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ti spiego

    La prima JTable contiene 10 righe, aggiornando il model con un resultset da 7 righe , la seconda dabbella ha sempre 10 righe di cui 7 con i nuovi dati e 3 righe tutte bianche.

    poi tu intendi un metodo del genere :

    codice:
    public ResultSet setResultSet(ResultSet aResultset){
    		rs = aResultset;
    		return rs;
    }
    ovviamente modificando il costruttore.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fcorsa
    La prima JTable contiene 10 righe, aggiornando il model con un resultset da 7 righe , la seconda dabbella ha sempre 10 righe di cui 7 con i nuovi dati e 3 righe tutte bianche.
    Mi pare strano .... parli di "la prima JTable" ma hai 1 solo JTable? E gli cambi solo il model???
    Boh .... c'è sicuramente dell'altro .....

    Originariamente inviato da fcorsa
    poi tu intendi un metodo del genere :

    codice:
    public ResultSet setResultSet(ResultSet aResultset){
    		rs = aResultset;
    		return rs;
    }
    Non vedo a cosa ti serve restituire il result set. E comunque non basta. Il model così può essere informato dei nuovi dati (e se avesse, non è il tuo caso, una propria struttura dati sarebbe da aggiornare) ma poi i listener andrebbero notificati usando uno dei fireXXX di AbstractTableModel.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Non sono due le JTable . La JTable è sempre la stessa. Uso prima e seconda per farti capire quando ho usato .setModel() (cioè nella seconda).

  8. #8
    Ti posto l'intero codice

    codice:
    public class PannelloRicercaCollaudi extends JPanel  implements ActionListener, KeyListener{
    	PannelloIndex index2;
    	JPanel panelNord = new JPanel();
    	JTextField input1 = new JTextField(2);
    	JTextField input2 = new JTextField(2);
    	JTextField input3 = new JTextField(4);
    	JTextField input4 = new JTextField(25);
    	JTextField input5 = new JTextField(25);
    	JTextField input6 = new JTextField(25);
    	
    	Connection con;
    	Statement stat;
    	ResultSet rs;
    	String query;
    	JTable table;
    	JScrollPane scrollpane;
    	JButton cerca = new JButton("CERCA");
    
    	Border bord1 = BorderFactory.createRaisedBevelBorder();
    	Border bord2 = BorderFactory.createLoweredBevelBorder();
    	Border bord = BorderFactory.createCompoundBorder(bord1,bord2);
    	
    	JPanel buttonPanelSud = new JPanel();
    	JButton stampa = new JButton("Stampa Lista");
    	JButton esci = new JButton("Chiudi");
    	JButton cancella = new JButton("Cancella");
    	public PannelloRicercaCollaudi(PannelloIndex index, Connection conn) {
    		//setta il riferimento passato
    		index2=index;
    		try {
    			con=conn;
    			stat = con.createStatement();
    //			se non ci sono dati chiude il resultset
    			if(rs != null){rs.close();}
    //			 stringa della query per la visualizzazione delle materiali
    			query = "select id,commessa,data_com,cod_specifica,quantita,data,cartone from collaudo where cartone!='10000' order by id desc;";
    //			esegue la query con le caratteristiche della tabbellascrollabile
    			rs = stat.executeQuery(query);
    //			crea la tabella con il modello 
    			ModelloTabella model= new ModelloTabella(rs);
    			table = new JTable(model);
    //			 abilita la selezione di una linea
    			table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    			//metodo che ordina la tabella in base alla header(intestazione di colonna) cliccato.
    			table.setRowSorter(new TableRowSorter (model));
    //			aggiunge la tabella allo scrollpane
    			scrollpane = new JScrollPane(table);
    //			setta il layout
    			this.setLayout(new BorderLayout());
    			//aggiunge i pannelli
    			panelNord.setLayout(new GridLayout(4,3));
    			
    			JPanel labpanel1 = new JPanel();
    			JLabel label1 = new JLabel("Commessa :");
    			labpanel1.add(label1);
    			panelNord.add(labpanel1);
    			JPanel strPanel1 = new JPanel();
    			strPanel1.add(input4);
    			panelNord.add(strPanel1);
    			panelNord.add(new JPanel());
    			
    			JPanel labpanel6 = new JPanel();
    			JLabel label6 = new JLabel("Specifica :");
    			labpanel6.add(label6);
    			panelNord.add(labpanel6);
    			JPanel strPanel6 = new JPanel();
    			strPanel6.add(input6);
    			panelNord.add(strPanel6);
    			panelNord.add(new JPanel());
    			
    			JPanel labpanel2 = new JPanel();
    			JLabel label2 = new JLabel("Cartone :");
    			labpanel2.add(label2);
    			panelNord.add(labpanel2);
    			JPanel strPanel2 = new JPanel();
    			strPanel2.add(input5);
    			panelNord.add(strPanel2);
    			panelNord.add(new JPanel());
    			
    			JPanel labPanel =new JPanel();
    			JLabel label = new JLabel("Data Collaudo :");
    			labPanel.add(label);
    			panelNord.add(labPanel);
    			
    			JPanel strPanel = new JPanel();
    			strPanel.add(input1);
    			strPanel.add(new JLabel(" / "));
    			strPanel.add(input2);
    			strPanel.add(new JLabel(" / "));
    			strPanel.add(input3);
    			panelNord.add(strPanel);
    			
    			JPanel strPanel3 = new JPanel();
    			strPanel3.add(cerca);
    			panelNord.add(strPanel3);
    			panelNord.setBorder(bord);
    			
    			esci.setBackground(Color.red);
    			
    			buttonPanelSud.add(stampa);			
    			buttonPanelSud.add(cancella);
    			buttonPanelSud.add(esci);
    			scrollpane.setBorder(bord);
    			//scrollpane2.setBorder(bord);
    			this.add(panelNord,BorderLayout.NORTH);
    			this.add(scrollpane,BorderLayout.CENTER);
    			this.add(buttonPanelSud,BorderLayout.SOUTH);
    			
    			stampa.addActionListener(this);	
    			esci.addActionListener(this);
    			cancella.addActionListener(this);
    			cerca.addActionListener(this);
    			cerca.addKeyListener(this);
    			input1.addKeyListener(this);
    			input2.addKeyListener(this);
    			input3.addKeyListener(this);
    			input4.addKeyListener(this);
    			input5.addKeyListener(this);
    			input6.addKeyListener(this);
    		}catch(Exception e){e.printStackTrace();}
    		
    	}
    
    	public void actionPerformed(ActionEvent event) {
    		
    		if(event.getActionCommand()=="CERCA"){
    			if((!input1.getText().equals("")||!input2.getText().equals("")||!input3.getText().equals(""))&&(!input4.getText().equals("")||!input5.getText().equals("")||!input6.getText().equals(""))){
    				JOptionPane.showMessageDialog(null, "Inserire un parametro per la ricerca !!","Errore !",JOptionPane.ERROR_MESSAGE);
    			}else{
    				if(input1.getText().equals("")&&input2.getText().equals("")&&input3.getText().equals("")&&input4.getText().equals("")&&input5.getText().equals("")&&input6.getText().equals("")){
    					JOptionPane.showMessageDialog(null, "Nessun parametro inserito per la ricerca !!","Errore !",JOptionPane.ERROR_MESSAGE);
    					query = "select id,commessa,data_com,cod_specifica,quantita,data,cartone from collaudo where cartone!='10000' order by id desc;";
    					try {
    						Statement st1 = con.createStatement();
    						ResultSet rs1 = st1.executeQuery(query);
    						ModelloTabella model1= new ModelloTabella(rs1);
    						table.setModel(model1);
    					} catch (SQLException e) {JOptionPane.showMessageDialog(null, "Inserimento dati errato !!","Errore !",JOptionPane.ERROR_MESSAGE);}	
    		
    				}else{
    					if(input1.getText().equals("")&&input2.getText().equals("")&&input3.getText().equals("")&&!input4.getText().equals("")&&(!input5.getText().equals("")||!input6.getText().equals(""))){
    						JOptionPane.showMessageDialog(null, "Inserire un parametro !!","Errore !",JOptionPane.ERROR_MESSAGE);
    					}else{
    						if(input1.getText().equals("")&&input2.getText().equals("")&&input3.getText().equals("")&&(!input4.getText().equals("")||!input5.getText().equals(""))&&!input6.getText().equals("")){
    							JOptionPane.showMessageDialog(null, "Inserire un parametro !!","Errore !",JOptionPane.ERROR_MESSAGE);
    						}else{
    								if(!input1.getText().equals("")&&!input2.getText().equals("")&&!input3.getText().equals("")){
    									String data = input1.getText()+"/"+input2.getText()+"/"+input3.getText();
    									if(input4.getText().equals("")&&input5.getText().equals("")&&input6.getText().equals("")){
    										//query solo per data
    										query = "select id,commessa,data_com,cod_specifica,quantita,data,cartone from collaudo where cartone!='10000' and data = '"+data+"' order by id desc;";
    									}
    								}
    								if(input1.getText().equals("")&&input2.getText().equals("")&&input3.getText().equals("")&&!input4.getText().equals("")&&input5.getText().equals("")&&input6.getText().equals("")){
    									//query solo per commessa
    									query = "select id,commessa,data_com,cod_specifica,quantita,data,cartone from collaudo where cartone!='10000' and commessa like '%"+input4.getText()+"%';";
    								}
    								if(input1.getText().equals("")&&input2.getText().equals("")&&input3.getText().equals("")&&input4.getText().equals("")&&!input5.getText().equals("")&&input6.getText().equals("")){
    									//query solo per cartone
    									query = "select id,commessa,data_com,cod_specifica,quantita,data,cartone from collaudo where cartone!='10000' and cartone like '%"+input5.getText()+"%';";
    								}
    								if(input1.getText().equals("")&&input2.getText().equals("")&&input3.getText().equals("")&&input4.getText().equals("")&&input5.getText().equals("")&&!input6.getText().equals("")){
    									//query solo per specifica
    									query = "select id,commessa,data_com,cod_specifica,quantita,data,cartone from collaudo where cartone!='10000' and cod_specifica like '%"+input6.getText()+"%';";
    								}
    								try {
    									Statement st2 = con.createStatement();
    									ResultSet rs2 = st2.executeQuery(query);
    									ModelloTabella model2= new ModelloTabella(rs2);
    									table.setModel(model2);
    								} catch (SQLException e) {JOptionPane.showMessageDialog(null, "Inserimento dati errato !!","Errore !",JOptionPane.ERROR_MESSAGE);}	
    					}
    				}		
    				}
    			}	
    		}
    		if(event.getActionCommand()=="Cancella"){
    			int par[]=table.getSelectedRows();
    			//	 messaggio con input per eliminazione
    			
    			int delete = JOptionPane.showConfirmDialog(null, "Sei sicuro di voler cancellare il collaudo ID "+table.getValueAt(par[0], 0)+"?  ");
    						
    			if(delete==0){
    			//	 crea oggetto per la classe di eliminazione
    			CancellaCollaudo xxx = new CancellaCollaudo();
    			String str=""+table.getValueAt(par[0], 0);
    			xxx.CancellaCollaudo(str,con);
    			cerca.doClick();
    			}
    			if(delete==1){
    				JOptionPane.showMessageDialog(null, "Operazione Cancellazione annullata !!","Attenzione !",JOptionPane.INFORMATION_MESSAGE);
    			}
    		}
    	}
    
    	public void keyPressed(KeyEvent arg0) {
    		if(arg0.getKeyCode() == 10) { 
    		       cerca.doClick();
    		}
    	}
    
    	public void keyReleased(KeyEvent arg0) {}
    	public void keyTyped(KeyEvent arg0) {}
    
    }

  9. #9
    Posto due screnn per farti capire andbin.

    prima della ricerca

    http://img69.imageshack.us/img69/7466/immn.jpg


    dopo la ricerca

    http://img693.imageshack.us/img693/2205/imm2.jpg

  10. #10

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.