Jak wypełnić dane w JTable bazą danych?
Chcę wyświetlić tabelę JTable, która wyświetla dane z tabeli bazy danych tak, jak jest.
Do tej pory używałem JTable, który wyświetla dane z obiektu [] [].
Wiem, że jednym ze sposobów wyświetlania danych jest najpierw przekonwertowanie tabeli bazy danych na obiekt [] [], ale czy jest jakiś inny, który jest łatwy, a jednocześnie bardziej wydajny i elastyczny.
7 answers
Zalecałbym następujące podejście:
- Utwórz klasę
Row
reprezentującą wiersz odczytany z twojegoResultSet
. Może to być zwykła owijka wokółObject[]
. - tworzy kolekcję
List<Row>
i podklasęAbstractTableModel
, która ma być wspierana przez tę kolekcję. - użyj
SwingWorker
, aby wypełnićList<Row>
, czytając z podstawowegoResultSet
w wątku tła (tj. w metodziedoInBackground()
). Wywołanie metodySwingWorker
'spublish
, aby opublikowaćRow
S z powrotem do zdarzenia Wątek wysyłkowy (np. co 100 wierszy). - Po wywołaniu metody
SwingWorker
sprocess
z odczytanym ostatnim fragmentem wierszy, dodaj je do swojegoList<Row>
i uruchom odpowiednieTableEvent
s, aby zaktualizować wyświetlacz. - użyj również
ResultSetMetaData
, aby określićClass
każdej kolumny w ramach definicjiTableModel
. Spowoduje to ich poprawne wyrenderowanie(co nie będzie miało miejsca, jeśli po prostu użyjesz tablicy 2DObject[][]
).
Zaletą tego podejścia jest to, że interfejs użytkownika nie blokuje się podczas przetwarzania dużych ResultSet
s, A wyświetlacz będzie aktualizowany stopniowo w miarę przetwarzania wyników.
EDIT
Dodano przykładowy kod poniżej:
/**
* Simple wrapper around Object[] representing a row from the ResultSet.
*/
private class Row {
private final Object[] values;
public Row(Object[] values) {
this.values = values;
}
public int getSize() {
return values.length;
}
public Object getValue(int i) {
return values[i];
}
}
// TableModel implementation that will be populated by SwingWorker.
public class ResultSetTableModel extends AbstractTableModel {
private final ResultSetMetaData rsmd;
private final List<Row> rows;
public ResultSetTableModel(ResultSetMetaData rsmd) {
this.rsmd = rsmd;
this.rows = new ArrayList<Row>();
}
public int getRowCount() {
return rows.size();
}
public int getColumnCount() {
return rsmd.getColumnCount();
}
public Object getValue(int row, int column) {
return rows.get(row).getValue(column);
}
public String getColumnName(int col) {
return rsmd.getColumnName(col - 1); // ResultSetMetaData columns indexed from 1, not 0.
}
public Class<?> getColumnClass(int col) {
// TODO: Convert SQL type (int) returned by ResultSetMetaData.getType(col) to Java Class.
}
}
// SwingWorker implementation
new SwingWorker<Void, Row>() {
public Void doInBackground() {
// TODO: Process ResultSet and create Rows. Call publish() for every N rows created.
}
protected void process(Row... chunks) {
// TODO: Add to ResultSetTableModel List and fire TableEvent.
}
}.execute();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-03 15:33:01
Innym wydajnym i elastycznym sposobem wyświetlania danych bazy danych w tabeli JTable jest załadowanie danych wynikowych zapytania do CachedRowSet, a następnie podłączenie go do JTable za pomocą adaptera TableModel.
- zapytanie - - - > Dane bazy danych - - - > RowSet
- RowSet tablemodel adapter JTable
Ta książka autorstwa George 'a Reese' a daje kod źródłowy dla jego klasy RowSetModel aby dostosować RowSet jako TableModel. Zadziałało dla mnie po wyjęciu z pudełka. Moja jedyna zmiana to lepsza nazwa dla klasy: RowSetTableModel .
Wiersz jest podinterfejsem ResultSet, dodanym w Javie 1.4. Tak więc zestaw wierszy jest zestawem wynikowym.
Implementacja CachedRowSet wykonuje pracę za ciebie, zamiast tworzenia klasy Row, listy obiektów Row i ResultSetMetaData, jak opisano w innych odpowiedziach na tej stronie.
[[0]}Sun / Oracle dostarcza implementację referencyjną z CachedRowSet. Inni dostawcy lub sterowniki JDBC mogą również dostarczać implementacje.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-23 22:05:41
W zależności od tego, co już zrobiłeś i co chcesz zrobić, używam Netbeans z obsługą wiązania Beans dla aplikacji bazodanowej bardzo pomyślnie. Powiązujesz JTable z bazą danych, która automatycznie buduje zapytania JPA.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-03 15:45:59
Najlepszy sposób na wypełnienie jTable z ResultSet
Wymagania wstępne
1) zestaw wyników " rs " jest wypełniony danymi, których potrzebujesz. 2) JTable" jTable1 " jest tworzony przed ręką 3) nagłówek tabeli jest zaimplementowany przed ręką
Realizacja
java.sql.ResultSet rs = datacn.executeSelectQuery(query);
//Filling JTable with Result set
// Removing Previous Data
while (jTable1.getRowCount() > 0) {
((DefaultTableModel) jTable1.getModel()).removeRow(0);
}
//Creating Object []rowData for jTable's Table Model
int columns = rs.getMetaData().getColumnCount();
while (rs.next())
{
Object[] row = new Object[columns];
for (int i = 1; i <= columns; i++)
{
row[i - 1] = rs.getObject(i); // 1
}
((DefaultTableModel) jTable1.getModel()).insertRow(rs.getRow() - 1,row);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 08:45:10
Musisz utworzyć niestandardowy TableModel tam możesz określić skąd i skąd pochodzą dane.
Naprawdę musisz w pełni zrozumieć najpierw jak JTable + TableModel działa, a następnie postępuj zgodnie z jedną z wcześniej zamieszczonych odpowiedzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-03 15:57:30
Wiem, że pytanie jest stare, ale dla każdego, kto podąża za rozwiązaniem Adamskiego, należy zachować ostrożność dzieląc ResultSet
i ResultSetMetadata
pomiędzy GUI i SwingWorker
wątki. Otrzymałem niespójny wewnętrzny wyjątek stanu podczas korzystania z tego podejścia z SQLite. Rozwiązaniem jest załadowanie wszelkich metadanych do prywatnych pól przed wykonaniem SwingWorker
i posiadanie funkcji getter (getColumnName itp.), aby zamiast tego zwrócić pola.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-23 21:17:18
Podaję małą metodę wyświetlania danych tabeli w JTable. Jako parametr należy podać tylko Wynikowy zestaw tabeli bazy danych.
// rs is the ResultSet of the Database table
public void displayData(ResultSet rs)
{
//jt Represents JTable
//jf represents JFrame
int i;
int count;
String a[];
String header[] = {"1","2","3","4","5"}; //Table Header Values, change, as your wish
count = header.length;
//First set the Table header
for(i = 0; i < count; i++)
{
model.addColumn(header[i]);
}
jt.setModel(model); //Represents table Model
jf.add(jt.getTableHeader(),BorderLayout.NORTH);
a = new String[count];
// Adding Database table Data in the JTable
try
{
while (rs.next())
{
for(i = 0; i < count; i++)
{
a[i] = rs.getString(i+1);
}
model.addRow(a); //Adding the row in table model
jt.setModel(model); // set the model in jtable
}
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, "Exception : "+e, "Error", JOptionPane.ERROR_MESSAGE);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-28 07:55:08