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??
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??
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???Originariamente inviato da 1sirena
Vorrei sapere come si fa a caricare il contenuto di una riga selezionata di una jTable in una TextField.
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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:
![]()
![]()
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
codice:t.setRowSelectionAllowed(true); t.setColumnSelectionAllowed(false); t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); String key = (String) t.getModel().getValueAt(t.getSelectedRow(),4);
giusto??
Non era quello che si poteva capire dal tuo post iniziale ......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.![]()
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ho provato a farlo nel modo "più semplice" ma sicuramente non ho capito come si fa:![]()
Sono sempre 1sirena!!! cioè l'amica!!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); } }} } );![]()
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
t.setRowSelectionAllowed(true);
t.setColumnSelectionAllowed(false);
t.setSelectionMode(ListSelectionModel.SINGLE_SELEC TION);
Beh, chiaramente dovresti invocare getValueAt() per ognuna delle colonne ed impostare il valore al relativo text field.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);
codice:int row = t.getSelectedRow(); nome.setText ((String) t.getValueAt (row,0)); cognome.setText ((String) t.getValueAt (row,1)); ......
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ho provato a fare come dici tu! credo...
ti posto tutto il codice e le eccezioni che mi da:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1codice: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
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??
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]
Il mio modello tabella conta le righe e le colonne della tabella presente nel database in questo modo:
Metodi per calcolare righe e colonne: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
secondo te cosa nn va??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; }
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.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);
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.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet