Как заполнить данные в JTable с базой данных?

Я хочу отобразить JTable, которые отображают данные из Таблицы базы данных как есть.

До настоящего времени я использовал JTable, который отображает данные из Объекта [] [].

Я знаю, что один способ отобразить данные состоит в том, чтобы сначала преобразовать таблицу базы данных в Объект [] [], но Является там любым другим, который является легок еще более мощный и гибкий.

19
задан Yatendra Goel 3 February 2010 в 14:51
поделиться

4 ответа

Я бы рекомендовал использовать следующий подход:

  • Создайте класс Row для представления строки, считанной из вашего ResultSet . Это может быть простая оболочка вокруг Object [] .
  • Создайте коллекцию List и подкласс AbstractTableModel , которые будут поддерживаться этой коллекцией.
  • Используйте SwingWorker для заполнения вашего List путем чтения из нижележащего ResultSet в фоновом потоке (т. Е. Внутри метод doInBackground () ). Вызовите метод SwingWorker publish для публикации строк обратно в поток отправки событий (например, каждые 100 строк).
  • Когда вызывается метод процесса SwingWorker с последним прочитанным фрагментом строк, добавьте их в свой List и активируйте соответствующий TableEvent вызывает обновление дисплея.
  • Также используйте ResultSetMetaData , чтобы определить Класс каждого столбца в определении TableModel . Это приведет к их правильной визуализации (чего не будет, если вы просто используете массив 2D Object [] [] ).

Преимущество этого подхода заключается в том, что пользовательский интерфейс не блокируется при обработке больших ResultSet s, и что дисплей будет обновляться постепенно по мере обработки результатов.

РЕДАКТИРОВАТЬ

Добавлен пример кода ниже:

/**
 * 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
ответ дан 30 November 2019 в 03:07
поделиться

Вы должны создать собственный TableModel Здесь вы можете указать, откуда и как поступают данные.

Вы действительно должны сначала полностью понять, как работает JTable + TableModel , а затем следовать одному из ранее опубликованных ответов.

3
ответ дан 30 November 2019 в 03:07
поделиться

В зависимости от того, что вы уже сделали и что готовы сделать, я использую Netbeans с его поддержкой привязки Beans для базы данных. управляемое приложение очень успешно. Вы привязываете свой JTable к базе данных, и он автоматически создает запросы JPA.

4
ответ дан 30 November 2019 в 03:07
поделиться

Я предлагаю небольшой метод для отображения данных таблицы базы данных в JTable. Вам нужно передать в качестве параметра только набор результатов таблицы базы данных.


    // 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
ответ дан 30 November 2019 в 03:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: