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.

Author: Yatendra Goel, 2010-02-03

7 answers

Zalecałbym następujące podejście:

  • Utwórz klasę Row reprezentującą wiersz odczytany z twojego ResultSet. 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 podstawowego ResultSet w wątku tła (tj. w metodzie doInBackground()). Wywołanie metody SwingWorker's publish, aby opublikować Row S z powrotem do zdarzenia Wątek wysyłkowy (np. co 100 wierszy).
  • Po wywołaniu metody SwingWorker s process z odczytanym ostatnim fragmentem wierszy, dodaj je do swojego List<Row>i uruchom odpowiednie TableEvent s, aby zaktualizować wyświetlacz.
  • użyj również ResultSetMetaData, aby określić Class każdej kolumny w ramach definicji TableModel. Spowoduje to ich poprawne wyrenderowanie(co nie będzie miało miejsca, jeśli po prostu użyjesz tablicy 2D Object[][]).

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();
 24
Author: Adamski,
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.

  1. zapytanie - - - > Dane bazy danych - - - > RowSet
  2. 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.

RowSet tutorial

 7
Author: Basil Bourque,
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.

 4
Author: Jon,
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);
        }
 4
Author: Yogesh,
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.

 3
Author: OscarRyz,
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.

 1
Author: j_kar,
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);
    }
}
 0
Author: Ram,
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