Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di 1sirena
    Registrato dal
    Mar 2008
    Messaggi
    163

    caricare riga selezionata in una JTextField

    Ciao!
    Vorrei sapere come si fa a caricare il contenuto di una riga selezionata di una jTable in una TextField. Non ne ho idea...

    Qualcuna può darmi qualche consiglio??

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

    Re: caricare riga selezionata in una JTextField

    Originariamente inviato da 1sirena
    Vorrei sapere come si fa a caricare il contenuto di una riga selezionata di una jTable in una TextField.
    Cioè data la riga selezionata vuoi prendere le varie celle della riga, ottenere una unica stringa (concatenando i contenuti delle celle) e impostarla su un JTextField???

    Innanzitutto ricavi la riga selezionata da JTable con getSelectedRow(). Poi puoi usare getValueAt() che ti fornisce un Object. Se non sai (o non ti interessa sapere) a priori il tipo di dato nella colonna la cosa più generica è invocare toString() sull'object ottenuto e concatenare le varie stringhe in una unica stringa e poi la imposti nel JTextField.

    Non vedo molto l'utilità di una cosa del genere .... ma se devi fare questo, si può fare.
    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 L'avatar di 1sirena
    Registrato dal
    Mar 2008
    Messaggi
    163
    Per selezionare la riga devo fare così:

    codice:
    t.setRowSelectionAllowed(true);
    t.setColumnSelectionAllowed(false);
    t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    String key = (String) t.getModel().getValueAt(t.getSelectedRow(),4);

    giusto??

    Ma dopo io vorrei caricare i dati della tabella non in una singola JTextField ma ogni singolo dato in una diversa JTextField.

    I dati nella mia tabella utenti sono:

    Nome, cognome, password e id.

    e rispettivamente le JTextField soo:
    Nome, cognome, password e id.

    Come posso fare??
    Ciò mi serve per poter poi modificare il database! VVoVe:

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da 1sirena
    codice:
    t.setRowSelectionAllowed(true);
    t.setColumnSelectionAllowed(false);
    t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    String key = (String) t.getModel().getValueAt(t.getSelectedRow(),4);

    giusto??
    Tecnicamente sì. Comunque il getValueAt() ce l'ha anche JTable. Cioè puoi invocarlo sul JTable o sul table model, a tua discrezione.

    Originariamente inviato da 1sirena
    Ma dopo io vorrei caricare i dati della tabella non in una singola JTextField ma ogni singolo dato in una diversa JTextField.
    Non era quello che si poteva capire dal tuo post iniziale ......

    Comunque il modo più semplice (sebbene il più "crudo") è fare come hai fatto sopra, ovvero prendi il valore alla riga/colonna, ne ottieni un String (se sai che sono stringhe, il cast è ok) e imposti il valore con setText() nel text field.

    Una cosa un po' migliore e più "pulita" sarebbe gestire il "record" (inteso come insieme di dati correlati) come un oggetto. Cioè nel tuo caso realizzare (se non l'hai già fatto) una classe Utente che contiene quei dati e il tuo table model gestirà quindi un array/ArrayList di oggetti Utente. Ti basta poi fare un metodo nel table model che ti restituisce un Utente alla riga X.

    Poi cosa ne fai dell'oggetto Utente ... beh, scegli tu. Potresti passarlo ad un'altra tua dialog che permette di modificare i dati.
    Insomma ... quello che sto cercando di dire è che per questo tipo di cose si dovrebbe pensare un po' più "ad oggetti" piuttosto che fare getValueAt() così .... sparpagliate ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    49
    Ho provato a farlo nel modo "più semplice" ma sicuramente non ho capito come si fa:

    codice:
    public void actionPerformed(ActionEvent evt) {
    		{
    				try{
    	if(t.getSelectedRow()==-1){//se non hai selezionato niente
    	JOptionPane.showMessageDialog(null,"Non hai selezionato nessuna riga", "Attenzione",JOptionPane.ERROR_MESSAGE);
    		}else{
    		t.setRowSelectionAllowed(true);
    		t.setColumnSelectionAllowed(false);
    		t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    		String key = (String) t.getModel().getValueAt(t.getSelectedRow(),4);
    		nome.setText(key);
    		cognome.setText(key);
    		password.setText(key);
    		id.setText(key);
    	//SQLManager sql = new SQLManager("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/schedule","root","root");
    		//sql.cancella(key);
    		
    //sql.close();	
    						
    	}
    				
    			}
    			catch(Exception ex){
    									
    				ex.printStackTrace();
    //JOptionPane.showMessageDialog(null,"Non esiste l'oggetto selezionato", "Attenzione",JOptionPane.ERROR_MESSAGE);
    	
    				
    				}
    				
    			
    	}}
    	} );
    Sono sempre 1sirena!!! cioè l'amica!!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nala84
    t.setRowSelectionAllowed(true);
    t.setColumnSelectionAllowed(false);
    t.setSelectionMode(ListSelectionModel.SINGLE_SELEC TION);
    In genere, tipicamente, questo tipo di impostazioni si fanno all'inizio, quando crei la interfaccia utente. Cioè è all'inizio che in genere si stabilisce che quella tal tabella gestirà una selezione singola piuttosto che multipla ecc....

    Originariamente inviato da nala84
    String key = (String) t.getModel().getValueAt(t.getSelectedRow(),4);
    nome.setText(key);
    cognome.setText(key);
    password.setText(key);
    id.setText(key);
    Beh, chiaramente dovresti invocare getValueAt() per ognuna delle colonne ed impostare il valore al relativo text field.

    codice:
    int row = t.getSelectedRow();
    
    nome.setText ((String) t.getValueAt (row,0));
    cognome.setText ((String) t.getValueAt (row,1));
    ......
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    49
    Ho provato a fare come dici tu! credo...

    ti posto tutto il codice e le eccezioni che mi da:


    codice:
    public class Table2 extends JFrame implements ActionListener{
    /**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    
    private JButton tabella;
    private JPanel scatola; 
    
    private JTable t;
    public Connection conn;
    private JButton cancella;
    
    /** Costruttore Data*/
    public Table2() {
    super("prova database");
    setSize(500,250);
    setLocation(200,200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    
    tabella = new JButton("DATI IN TABELLA");
    scatola = new JPanel();
    
    
    
    
    tabella.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
    try {
    leggitabella(e);
    } catch (SQLException ex) {
    ex.printStackTrace();
    } 
    }
    });
    
     
    
    scatola.setLayout(null);
    add(scatola); 
    
    
    scatola.add(tabella);
    tabella.setBounds(300,170,150,30);
    
    
    }
    
    
    
    public static void main(String[] args){ 
    
    Table2 visualizza = new Table2();
    visualizza.setVisible(true);
    } 
    
    public void actionPerformed(ActionEvent e) {
    }
    
    // il metodo leggi dati leggi idati dall’archivio e li visualizza in una nuova finestra
    
    public void leggidati(ActionEvent e) throws SQLException{
    // Costruzione nuova finestra
    JDialog finestra = new JDialog();
    JTextArea lavagna = new JTextArea();
    Font f = new Font(" ", Font.BOLD,15); 
    lavagna.setFont(f);
    finestra.setTitle("finestra di dialogo col database");
    finestra.setSize(400,400);
    finestra.setLocation(300,200);
    finestra.setVisible(true); 
    finestra.setLayout(new BorderLayout());
    finestra.add(BorderLayout.CENTER,new JScrollPane(lavagna)); 
    finestra.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    
    }
    
    
     // fine leggidati
    
    // parte relative alla visualizzazione dei dati in una tabella
    
    @SuppressWarnings("serial")
    
    
    
    // il metodo leggitabella fa vedre il dislay dei dati in una tabella in una nuova finestra
    
    public void leggitabella(ActionEvent e) throws SQLException{
    
    // costruzione nuova finestra
    
    JDialog finestra2 = new JDialog();
    JPanel PannelloBottoni = new JPanel();
    cancella = new JButton("Cancella");
    
    JButton modifica = new JButton("Modifica");
    final JTextField id = new JTextField();
    final JTextField password = new JTextField();
    final JTextField cognome = new JTextField();
    final JTextField nome = new JTextField();
    	
    
    @SuppressWarnings("unused")
    //JTextArea lavagna2 = new JTextArea();
    Font f2 = new Font(null, Font.BOLD,15); 
    ModTab miomodello = new ModTab("utenti2");
    t = new JTable(miomodello);
    t.setRowSelectionAllowed(true);
    t.setColumnSelectionAllowed(false);
    t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    
    finestra2.add("North", t);
    finestra2.add("South", PannelloBottoni);
    FormLayout jPanel1Layout = new FormLayout(
    		"88dlu, max(p;5dlu), 91dlu, 5dlu, 78dlu, max(p;5dlu), 71dlu", 
    		"max(p;5dlu), max(p;5dlu), 8dlu, 17dlu, 37dlu, max(p;5dlu), 62dlu, max(p;5dlu), 62dlu");
    PannelloBottoni.setLayout(jPanel1Layout);
    PannelloBottoni.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    PannelloBottoni.setBackground(new Color(0, 51, 255));
    PannelloBottoni.setPreferredSize(new java.awt.Dimension(542, 367));
    PannelloBottoni.add(nome, new CellConstraints("1, 6, 1, 1, default, default"));
    PannelloBottoni.add(cognome, new CellConstraints("3, 6, 1, 1, default, default"));
    PannelloBottoni.add(password, new CellConstraints("5, 6, 1, 1, default, default"));
    PannelloBottoni.add(id, new CellConstraints("7, 6, 1, 1, default, default"));
    PannelloBottoni.add(cancella, new CellConstraints("3, 8, 1, 1, default, default"));
    
    PannelloBottoni.add(modifica, new CellConstraints("5, 8, 1, 1, default, default"));
    
    int row = t.getSelectedRow();
    
    nome.setText ((String) t.getValueAt (row,0));
    cognome.setText ((String) t.getValueAt (row,1));
    password.setText ((String) t.getValueAt (row,2));
    id.setText ((String) t.getValueAt (row,3));
    /*
    cancella.addActionListener(new ActionListener() {
    	
    	public void actionPerformed(ActionEvent evt) {
    		{
    				try{
    					if(t.getSelectedRow()==-1){//se non hai selezionato niente
    					JOptionPane.showMessageDialog(null,"Non hai selezionato nessuna riga", "Attenzione",JOptionPane.ERROR_MESSAGE);
    					}else{
    						t.setRowSelectionAllowed(true);
    						t.setColumnSelectionAllowed(false);
    						t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    						String key = (String) t.getModel().getValueAt(t.getSelectedRow(),3);
    						//nome.setText ((String) t.getValueAt (t.getSelectedRow(),0));
    						//cognome.setText ((String) t.getValueAt (t.getSelectedRow(),1));
    						//password.setText ((String) t.getValueAt(t.getSelectedRow(), 2));
    						//id.setText ((String) t.getValueAt(t.getSelectedRow(), 3));						
    
     
    						
    						SQLManager sql = new SQLManager("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/schedule","root","root");
    						sql.cancella(key);
    
    						
    				sql.close();	
    						
    				}
    				
    			}
    			catch(Exception ex){
    									
    				ex.printStackTrace();
    					//JOptionPane.showMessageDialog(null,"Non esiste l'oggetto selezionato", "Attenzione",JOptionPane.ERROR_MESSAGE);
    	
    				
    				}
    				
    			
    	}}
    	} );
    
    
    	
    
    
    
    	
    	
    	/* TODO Auto-generated method stub
    	t.setRowSelectionAllowed(true);
    	t.setColumnSelectionAllowed(false);
    	t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    	String key = (String) t.getModel().getValueAt(t.getSelectedRow(),1);
    	SQLManager sql = new SQLManager("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/schedule","root","root");
    	//*sql.cancella(key);
    */
    			
    
    
    finestra2.add(t);
    finestra2.setFont(f2);
    finestra2.setTitle("visualizzazione dati in tabella");
    finestra2.setSize(1280, 775);
    //finestra2.setLocation(0,0);
    finestra2.setVisible(true); 
    finestra2.setLayout(new BorderLayout());
    finestra2.add(BorderLayout.NORTH,new JScrollPane(t)); 
    finestra2.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    
    
    
    } // fine leggitabella
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at org.schedule.prova.ModTab.getValueAt(ModTab.java:2 9)
    at javax.swing.JTable.getValueAt(Unknown Source)
    at org.schedule.prova.Table2.leggitabella(Table2.java :161)
    at org.schedule.prova.Table2$1.actionPerformed(Table2 .java:59)
    at javax.swing.AbstractButton.fireActionPerformed(Unk nown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed (Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed (Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent( Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(U nknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unkno wn Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilter s(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(U nknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarch y(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)


    Secondo te qual'è il problema??

  8. #8
    Utente di HTML.it L'avatar di Metflar
    Registrato dal
    Apr 2007
    Messaggi
    790
    posta la classe ModTab sembra che l'errore sia li alla riga 29 :master:
    conoscenze: C/C++, Java, PHP, Python
    [No PM tecnici o di qualsiasi genere]

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    49
    Il mio modello tabella conta le righe e le colonne della tabella presente nel database in questo modo:

    codice:
    import java.sql.ResultSet;
    
    import javax.swing.table.AbstractTableModel;
    
    import org.schedule.db.SQLManager;
    
    	public class ModTab extends AbstractTableModel{ 
    	
    		private static final long serialVersionUID = 1L;
    
    	//La base dati in cui vengono memorizzati i dati della tabella è la seguente
    	// Array di stringhe contente i nome delle colonne
    		String[] ColumnsName;
    	// Matrice contenente i dati della tabella
    		String[][] cells;
    	
    		public int getRowCount(){
    			return cells.length; 
    			} // ritorna il numero delle celle
    
    			public int getColumnCount(){
    				return ColumnsName.length;
    			} // ritorna il numero delle colonne
    
    		
    			public Object getValueAt(int r, int c) {
    
    				return (String)cells[r][c];
    
    			} // fine Object getValueAct 
    
    
    			public String getColumnName(int c) { 
    				return ColumnsName[c];
    			} // ritorna il nome delle colonne
    		
    	
    			public ModTab(String NomeTable) {
    
    				super(); 
    	
    	// Il numero di recod presenti nella tabella
    				int rowCount;
    	// La query creata per accedere al database
    				String query;
    
    	// Apre la connesione al database
    				SQLManager sqlm = new SQLManager("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/schedule","root","root");
    	
    	 // Imposta la query
    				query = "Select * from " + NomeTable;
    	
    				try{
    		// Recupero il numero di record nella tabella
    					rowCount = SQLManager.getRecordCount(NomeTable);
    		// Recupero le intestazioni delle colonne
    					ColumnsName = SQLManager.getColumnsName(NomeTable);
    		// Creo la matrice dei dati
    					cells = new String [rowCount][ColumnsName.length];
    		
    		// eseguo la query
    					ResultSet rs = SQLManager.execute(query); 
    		 
    		// Contatore usato per l'iterazione su cells
    					int counter =0;
    		
    		// questo while viene caricata, riga per riga, la matrice 
    	    // dei dati
    					while (rs.next()){
    						for (int i=0; i<ColumnsName.length; i++)
    							cells[counter][i] = rs.getString(i+1);
    						counter++;
    					}
    				}
    				catch (Exception ex){
    					System.out.println(ex);
    				}
    				finally{
    		// In ogni caso chiude la connesione al database
    
    					sqlm.close();
    				}
    			}// fine costruttore
    
    			
    
    
    		} // fine class Modtab
    Metodi per calcolare righe e colonne:

    codice:
    codice://Ottiene il numero di record presenti in una tabella
    		public static int getRecordCount(String NomeTable) {
    			int result = 0;
    			try{ 
        	
    				String query = "Select count(*) from " +NomeTable;
    				rs = Stm.executeQuery(query); 
    				rs.next(); 
    				result = rs.getInt(1); 
    			}catch(Exception ex){ 
    				ex.printStackTrace(); 
                 	} 
    				return result; 
        		} 
        //Ottiene la lista dei nomi delle colonne di una determinata tabella
    		public static String[] getColumnsName(String NomeTable){
    			String[] columnsName = null;
    			try{ 
    
    				ResultSet rs = Stm.executeQuery(
    						"SELECT * FROM " + NomeTable);
    				ResultSetMetaData rsmd = rs.getMetaData();
    
    				int columnsNumber = rsmd.getColumnCount();
    				columnsName = new String[columnsNumber];
    
    				for (int i=0; i< columnsNumber; i++){
    					columnsName[i] = rsmd.getColumnName(i+1);
    				}
    			}catch(Exception ex){ 
    				ex.printStackTrace(); 
                   	}
    			return columnsName; 
        		}
    secondo te cosa nn va??

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nala84
    codice:
    	public void actionPerformed(ActionEvent evt) {
    		{
    				try{
    					if(t.getSelectedRow()==-1){//se non hai selezionato niente
    					JOptionPane.showMessageDialog(null,"Non hai selezionato nessuna riga", "Attenzione",JOptionPane.ERROR_MESSAGE);
    					}else{
    						t.setRowSelectionAllowed(true);
    						t.setColumnSelectionAllowed(false);
    						t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    Prima probabilmente non ho chiarito bene la questione. Mettendo queste 3 impostazioni che ho indicato in rosso nel actionPerformed, il modo di selezione diventa a "selezione singola" SOLO quando hai premuto il pulsante Cancella e c'è già una selezione.

    Ma ha senso?? È proprio quello che vuoi?

    Ripeto che se non devi cambiare dinamicamente il modo di selezione, andrebbero fatte una volta sola all'inizio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.