Mam problem, ponieważ nie wiem jak odświeżyć JTable po dodaniu rekordu do bazy danych. Sytuacja jest następująca. Po uruchomieniu programu ładuje się Ramka (JFrame), zawierająca różne przyciski (między innymi przycisk dodawania nowych rekordów do bazy), oraz obiekt JTable, który wypełnia się danymi, pobieranymi z bazy danych przy uruchamianiu aplikacji.
Chcąc dodać nowy rekord wybieramy stosowny przycisk na głównym oknie co powoduje wyświetlenie JDialoga, w którym znajduję się stosowny formularz. Po zatwierdzeniu tego okna, rekord wędruje do bazy danych lecz brakuje aktualizacji obiektu JTable.
Czytałem, że aby uzyskać zamierzony efekt można skorzystać z metody fireTableDataChanged(), którą powinno się zaimplementować w modelu tabeli; itp., jednak nie wiem jak je zaimplementować w przypadku mojej aplikacji, tzn. próbowałem różnych kombinacji, szukałem na googlach i nie znalazłem nic sensownego.
Na listingu poniżej przedstawiłem kod mojego modelu tabeli:
import javax.swing.table.*;
import java.util.*;
import java.sql.*;
/**
*
* @author Yuras
*/
/**
* Klasa modelu tabeli
* @author Yuras
*/
class MyTableModel extends AbstractTableModel {
String[] columnNames = {"Id",
// tutaj nazwy 7 pozostalych kolumn
};
private Object[][] obiekt() {
ArrayList dane = null;
try {
Baza baza = new Baza();
dane = baza.Odczyt();
} catch (SQLException ex) {
}
Object[][] ob = new Object[dane.size()][8];
for (int i = 0; i < dane.size(); i++) {
String[] linia = (String[]) dane.get(i);
ob[i][0] = linia[0];
ob[i][1] = linia[1];
ob[i][2] = linia[2];
ob[i][3] = linia[3];
ob[i][4] = linia[4];
ob[i][5] = linia[5];
ob[i][6] = linia[6];
ob[i][7] = linia[7];
}
return ob;
}
private Object[][] data = obiekt();
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return true;
}
@Override
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
Do obsługi bazy danych wykorzystywana jest klasa Baza przytoczona na powyższym listingu. JTable znajduję się na panelu PanelTresci, który jest zarazem osobną klasą, wywoływaną na panelu głównym klasa Panel główny.</i>