Я хочу отобразить JTable, которые отображают данные из Таблицы базы данных как есть.
До настоящего времени я использовал JTable, который отображает данные из Объекта [] [].
Я знаю, что один способ отобразить данные состоит в том, чтобы сначала преобразовать таблицу базы данных в Объект [] [], но Является там любым другим, который является легок еще более мощный и гибкий.
Я бы рекомендовал использовать следующий подход:
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();
Вы должны создать собственный TableModel Здесь вы можете указать, откуда и как поступают данные.
Вы действительно должны сначала полностью понять, как работает JTable + TableModel , а затем следовать одному из ранее опубликованных ответов.
В зависимости от того, что вы уже сделали и что готовы сделать, я использую Netbeans с его поддержкой привязки Beans для базы данных. управляемое приложение очень успешно. Вы привязываете свой JTable к базе данных, и он автоматически создает запросы JPA.
Я предлагаю небольшой метод для отображения данных таблицы базы данных в 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);
}
}