Ciao a tutti!
Ho un problema molto strano con una JTable.
La cosa è abbastanza complicata quindi spero di riuscire a spiegarlo il meglio possibile.
Sto implementato una classe estensione della JTable che prende i dati da visualizzare da una tabella di un database MySql attraverso l'esecuzione di una query passata come parametro.
Fin qui nessun problema, la classe funziona correttamente e senza problemi.
Ora vorrei estendere questa classe per consentire anche la modifica e l'inserimento di righe, non direttamente dalla JTable ma attraverso l'apertura di una JDialog.
Io ho pensato di fare in questo modo:
- Il ResultSet che creo nella mia classe estensione della JTable è un UpdatableResultSet
- Sempre nella JTable inserisco un ListSelectionListener e faccio in modo che al cambiamento della riga corrente della JTable venga modificata anche la riga del ResultSet
- Infine quando l'utente clicca con il tasto destro sopra la JTable e sceglie la voce menu "Modifica" (ho creato un JPopupMenu) venga istanziata una JDialog a cui passo il riferimento al ResultSet creato dalla tabella e posizionato alla riga corrispondente la riga selezionata nella JTable.
In questo modo quando viene aperta la finestra di dialogo mi dovrei trovare il riferimento al ResultSet già posizionata sulla riga selezionata e quindi potrei apportare le modifiche direttamente su quel ResultSet attraverso i metodi updateXXX dell'UpdatableResultSet.
Tutto ok se non fosse per il fatto che inspiegabilmente quando scatta l'evento ActionEvent del JPopupMenu quindi al momento di passare il riferimento al ResultSet alla finestra di dialogo il cursore del ResultSet è posizionato sull'ultima riga.
Non so se sono riuscito a farmi capire comunque adesso per fare un po' di chiarezza posto anche due righe di codice magari si capisce meglio:
Questo è il codice che aggiunge il ListSelectionListener alla tabella e "sincronizza" la posizione del cursore del ResultSet alla posizione della riga della tabella:
codice:
private void initialize() {
// aggiungo il ListSelectionListener
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel rowSM = this.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
ListSelectionModel lsm = (ListSelectionModel)evt.getSource();
if (!lsm.isSelectionEmpty() && !evt.getValueIsAdjusting()) {
int row = lsm.getMinSelectionIndex();
dataTableModel.moveRsCursorToRow(row);
}
}
});
}
Questo è la funzione moveRsCursorToRow del modello della tabella
codice:
public void moveRsCursorToRow(int rowIndex) {
if (rs != null) {
try {
rs.absolute(rowIndex + 1);
currentRow = rs.getRow();
// Qui mi stampa la riga giusta (cioè quella selezionata nella JTable)
System.out.println("Riga corrent: " + rs.getRow());
} catch (SQLException e) {
new JErrorMessage(e);
}
}
}
Infine questo è il JPopupMenu che apre la finestra di dialogo per la modifica della riga selezionata
codice:
class ContextualMenu extends JPopupMenu implements ActionListener {
private JMenuItem nuovo = null, modifica = null, elimina = null;
public ContextualMenu() {
nuovo = new JMenuItem("Nuovo");
nuovo.addActionListener(this);
modifica = new JMenuItem("Modifica");
modifica.addActionListener(this);
elimina = new JMenuItem("Elimina");
elimina.addActionListener(this);
this.add(nuovo);
this.add(modifica);
this.add(elimina);
}
/**** Implemetazione interfaccia ActionListener ****/
public void actionPerformed(ActionEvent evt) {
if (evt.getActionCommand().equals("Nuovo")) {
try {
DialogPopup popup = (DialogPopup)Class.forName(dialog).newInstance();
((DataTableModel)dataTableModel).getResultSet().moveToInsertRow();
popup.setResultSet(((DataTableModel)dataTableModel).getResultSet());
((JDialog)popup).setVisible(true);
} catch (Exception e) {
new JErrorMessage(e);
}
}
else if (evt.getActionCommand().equals("Modifica")) {
try {
DialogPopup popup = (DialogPopup)Class.forName(dialog).newInstance();
// In questo punto sulla console mi stampa l'ultima riga anzichè quella selezionata
System.out.print("Riga corrente: " + ((DataTableModel)dataTableModel).getResultSet().getRow());
// Passo il riferimento al ResultSet alla finestra di dialogo aperta
popup.setResultSet(((DataTableModel)dataTableModel).getResultSet());
((JDialog)popup).setVisible(true);
} catch (Exception e) {
new JErrorMessage(e);
}
}
}
/**** Fine Implemetazione interfaccia ActionListener ****/
}
Grazie a tutti quelli che avranno voglia di aiutarmi