Código más simple para completar JTable de ResultSet

Busqué en Google todo el día y no tuve suerte. Llamo getnPrintAllData() método getnPrintAllData() después de presionar el botón OK. Entonces el código es:

 public class DatabaseSQLiteConnection { Connection conn = null; PreparedStatement statement = null; ResultSet res = null; public DatabaseSQLiteConnection(){ try{ Class.forName("org.sqlite.JDBC"); conn = DriverManager.getConnection("jdbc:sqlite:test.sqlite"); statement = conn.prepareStatement("SELECT * from product_info;"); } catch(Exception e){ e.printStackTrace(); } } public void getnPrintAllData(){ String name, supplier, id; DefaultTableModel dtm = new DefaultTableModel(); Window gui = new Window(); //My JPanel class try{ res = statement.executeQuery(); testResultSet(res); ResultSetMetaData meta = res.getMetaData(); int numberOfColumns = meta.getColumnCount(); while (res.next()) { Object [] rowData = new Object[numberOfColumns]; for (int i = 0; i < rowData.length; ++i) { rowData[i] = res.getObject(i+1); } dtm.addRow(rowData); } gui.jTable1.setModel(dtm); dtm.fireTableDataChanged(); ////////////////////////// } catch(Exception e){ System.err.println(e); e.printStackTrace(); } finally{ try{ res.close(); statement.close(); conn.close(); } catch(Exception e){ e.printStackTrace(); } } } public void testResultSet(ResultSet res){ try{ while(res.next()){ System.out.println("Product ID: "+ res.getInt("product_id")); System.out.println("Product name: "+ res.getString("product_name")); System.out.println("Supplier: "+ res.getString("supplier")); } } catch(Exception e){ e.printStackTrace(); } } } 

Mi método testResultSet() funciona correctamente. Ahora, ¿cómo cambiar mi código para que funcione, o cuál es el código más simple para hacer DefaultTableModel de ResultSet ? Gracias por adelantado.

Editar: estoy recibiendo java.lang.IllegalStateException: SQLite JDBC: inconsistent internal state error de java.lang.IllegalStateException: SQLite JDBC: inconsistent internal state .

Creo que la forma más sencilla de construir un modelo a partir de una instancia de ResultSet podría ser la siguiente.

 public static void main(String[] args) throws Exception { // The Connection is obtained ResultSet rs = stmt.executeQuery("select * from product_info"); // It creates and displays the table JTable table = new JTable(buildTableModel(rs)); // Closes the Connection JOptionPane.showMessageDialog(null, new JScrollPane(table)); } 

El método buildTableModel :

 public static DefaultTableModel buildTableModel(ResultSet rs) throws SQLException { ResultSetMetaData metaData = rs.getMetaData(); // names of columns Vector columnNames = new Vector(); int columnCount = metaData.getColumnCount(); for (int column = 1; column <= columnCount; column++) { columnNames.add(metaData.getColumnName(column)); } // data of the table Vector> data = new Vector>(); while (rs.next()) { Vector vector = new Vector(); for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { vector.add(rs.getObject(columnIndex)); } data.add(vector); } return new DefaultTableModel(data, columnNames); } 

ACTUALIZAR

¿Te gusta usar javax.swing.SwingWorker ? ¿Te gusta usar la statement try-with-resources ?

 public class GUI extends JFrame { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new GUI().setVisible(true); } }); } private final JButton button; private final JTable table; private final DefaultTableModel tableModel = new DefaultTableModel(); public GUI() throws HeadlessException { setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); table = new JTable(tableModel); add(new JScrollPane(table), BorderLayout.CENTER); button = new JButton("Load Data"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new SwingWorker() { @Override protected Void doInBackground() throws Exception { loadData(); return null; } }.execute(); } }); add(button, BorderLayout.PAGE_START); setSize(640, 480); } private void loadData() { LOG.info("START loadData method"); button.setEnabled(false); try (Connection conn = DriverManager.getConnection(url, usr, pwd); Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery("select * from customer"); ResultSetMetaData metaData = rs.getMetaData(); // Names of columns Vector columnNames = new Vector(); int columnCount = metaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { columnNames.add(metaData.getColumnName(i)); } // Data of the table Vector> data = new Vector>(); while (rs.next()) { Vector vector = new Vector(); for (int i = 1; i <= columnCount; i++) { vector.add(rs.getObject(i)); } data.add(vector); } tableModel.setDataVector(data, columnNames); } catch (Exception e) { LOG.log(Level.SEVERE, "Exception in Load Data", e); } button.setEnabled(true); LOG.info("END loadData method"); } } 

Creo que esta es la manera más fácil de llenar una tabla con ResultSet con un método como

 FillTable(MyTable, "select * Customers;"); 

Y se puede hacer un método muy simple como

 public void FillTable(JTable table, String Query) { try { CreateConnection(); Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery(Query); //To remove previously added rows while(table.getRowCount() > 0) { ((DefaultTableModel) table.getModel()).removeRow(0); } 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); } ((DefaultTableModel) table.getModel()).insertRow(rs.getRow()-1,row); } rs.close(); stat.close(); conn.close(); } catch(InstantiationException | IllegalAccessException | SQLException e) { } } 

Creo que esta es la manera más fácil de poblar / modelar una tabla con ResultSet .. Descargar e incluir rs2xml.jar Obtenga rs2xml.jar en sus bibliotecas

 import net.proteanit.sql.DbUtils; try { CreateConnection(); PreparedStatement st =conn.prepareStatement("Select * from ABC;"); ResultSet rs = st.executeQuery(); tblToBeFilled.setModel(DbUtils.resultSetToTableModel(rs)); conn.close(); } catch(Exception ex) { JOptionPane.showMessageDialog(null, ex.toString()); } 

Class Row manejará una fila de su base de datos.

Implementación completa de UpdateTask responsable de llenar la interfaz de usuario.

 import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.swing.JTable; import javax.swing.SwingWorker; public class JTableUpdateTask extends SwingWorker { JTable table = null; ResultSet resultSet = null; public JTableUpdateTask(JTable table, ResultSet rs) { this.table = table; this.resultSet = rs; } @Override protected JTable doInBackground() throws Exception { List rows = new ArrayList(); Object[] values = new Object[6]; while (resultSet.next()) { values = new Object[6]; values[0] = resultSet.getString("id"); values[1] = resultSet.getString("student_name"); values[2] = resultSet.getString("street"); values[3] = resultSet.getString("city"); values[4] = resultSet.getString("state"); values[5] = resultSet.getString("zipcode"); Row row = new Row(values); rows.add(row); } process(rows); return this.table; } protected void process(List chunks) { ResultSetTableModel tableModel = (this.table.getModel() instanceof ResultSetTableModel ? (ResultSetTableModel) this.table.getModel() : null); if (tableModel == null) { try { tableModel = new ResultSetTableModel(this.resultSet.getMetaData(), chunks); } catch (SQLException e) { e.printStackTrace(); } this.table.setModel(tableModel); } else { tableModel.getRows().addAll(chunks); } tableModel.fireTableDataChanged(); } } 

Modelo de tabla:

 import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.swing.table.AbstractTableModel; /** * Simple wrapper around Object[] representing a row from the ResultSet. */ 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 List rows; public ResultSetTableModel(ResultSetMetaData rsmd, List rows) { this.rsmd = rsmd; if (rows != null) { this.rows = rows; } else { this.rows = new ArrayList(); } } public int getRowCount() { return rows.size(); } public int getColumnCount() { try { return rsmd.getColumnCount(); } catch (SQLException e) { e.printStackTrace(); } return 0; } public Object getValue(int row, int column) { return rows.get(row).getValue(column); } public String getColumnName(int col) { try { return rsmd.getColumnName(col + 1); } catch (SQLException e) { e.printStackTrace(); } return ""; } public Class getColumnClass(int col) { String className = ""; try { className = rsmd.getColumnClassName(col); } catch (SQLException e) { e.printStackTrace(); } return className.getClass(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { if(rowIndex > rows.size()){ return null; } return rows.get(rowIndex).getValue(columnIndex); } public List getRows() { return this.rows; } public void setRows(List rows) { this.rows = rows; } } 

Aplicación principal que construye UI y hace la conexión de la base de datos

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTable; public class MainApp { static Connection conn = null; static void init(final ResultSet rs) { JFrame frame = new JFrame(); frame.setLayout(new BorderLayout()); final JTable table = new JTable(); table.setPreferredSize(new Dimension(300,300)); table.setMinimumSize(new Dimension(300,300)); table.setMaximumSize(new Dimension(300,300)); frame.add(table, BorderLayout.CENTER); JButton button = new JButton("Start Loading"); button.setPreferredSize(new Dimension(30,30)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JTableUpdateTask jTableUpdateTask = new JTableUpdateTask(table, rs); jTableUpdateTask.execute(); } }); frame.add(button, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/test"; String driver = "com.mysql.jdbc.Driver"; String userName = "root"; String password = "root"; try { Class.forName(driver).newInstance(); conn = DriverManager.getConnection(url, userName, password); PreparedStatement pstmt = conn.prepareStatement("Select id, student_name, street, city, state,zipcode from student"); ResultSet rs = pstmt.executeQuery(); init(rs); } catch (Exception e) { e.printStackTrace(); } } } 

Bueno, estoy seguro de que esta es la forma más simple de poblar JTable de ResultSet, sin ninguna biblioteca externa. He incluido comentarios en este método.

 public void resultSetToTableModel(ResultSet rs, JTable table) throws SQLException{ //Create new table model DefaultTableModel tableModel = new DefaultTableModel(); //Retrieve meta data from ResultSet ResultSetMetaData metaData = rs.getMetaData(); //Get number of columns from meta data int columnCount = metaData.getColumnCount(); //Get all column names from meta data and add columns to table model for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++){ tableModel.addColumn(metaData.getColumnLabel(columnIndex)); } //Create array of Objects with size of column count from meta data Object[] row = new Object[columnCount]; //Scroll through result set while (rs.next()){ //Get object from column with specific index of result set to array of objects for (int i = 0; i < columnCount; i++){ row[i] = rs.getObject(i+1); } //Now add row to table model with that array of objects as an argument tableModel.addRow(row); } //Now add that table model to your table and you are done :D table.setModel(tableModel); } 

El constructor de JTable acepta dos argumentos de 2dimension Object Array para los datos y String Array para los nombres de las columnas.

p.ej:

 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class Test6 extends JFrame { public Test6(){ this.setSize(300,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Mpanel m = new Mpanel(); this.add(m,BorderLayout.CENTER); } class Mpanel extends JPanel { JTable mTable; private Object[][] cells = {{"Vivek",10.00},{"Vishal",20.00}}; private String[] columnNames = { "Planet", "Radius" }; JScrollPane mScroll; public Mpanel(){ this.setSize(150,150); this.setComponent(); } public void setComponent(){ mTable = new JTable(cells,columnNames); mTable.setAutoCreateRowSorter(true); mScroll = new JScrollPane(mTable); this.add(mScroll); } } public static void main(String[] args){ new Test6().setVisible(true); } } 

Este es mi enfoque:

 String[] columnNames = {"id", "Nome", "Sobrenome","Email"}; List students = _repo.getAll(); Object[][] data = new Object[students.size()][4]; int index = 0; for(Student s : students) { data[index][0] = s.getId(); data[index][1] = s.getFirstName(); data[index][2] = s.getLastName(); data[index][3] = s.getEmail(); index++; } DefaultTableModel model = new DefaultTableModel(data, columnNames); table = new JTable(model); 

ir aquí blog de consejos de java

luego, ingrese su proyecto: listtabelmodel.java y rowtablemodel.java agreguen otra clase con este código:

  enter code here /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package comp; import java.awt.*; import java.sql.*; import java.util.*; import javax.swing.*; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.table.*; public class TableFromDatabase extends JPanel { private Connection conexao = null; public TableFromDatabase() { Vector columnNames = new Vector(); Vector data = new Vector(); try { // Connect to an Access Database conexao = DriverManager.getConnection("jdbc:mysql://" + "localhost" + ":3306/yourdatabase", "root", "password"); // Read data from a table String sql = "select * from tb_something"; Statement stmt = conexao.createStatement(); ResultSet rs = stmt.executeQuery(sql); ResultSetMetaData md = rs.getMetaData(); int columns = md.getColumnCount(); // Get column names for (int i = 1; i <= columns; i++) { columnNames.addElement(md.getColumnName(i)); } // Get row data while (rs.next()) { Vector row = new Vector(columns); for (int i = 1; i <= columns; i++) { row.addElement(rs.getObject(i)); } data.addElement(row); } rs.close(); stmt.close(); conexao.close(); } catch (Exception e) { System.out.println(e); } // Create table with database data JTable table = new JTable(data, columnNames) { public Class getColumnClass(int column) { for (int row = 0; row < getRowCount(); row++) { Object o = getValueAt(row, column); if (o != null) { return o.getClass(); } } return Object.class; } }; JScrollPane scrollPane = new JScrollPane(table); add(scrollPane); JPanel buttonPanel = new JPanel(); add(buttonPanel, BorderLayout.SOUTH); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("any"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. TableFromDatabase newContentPane = new TableFromDatabase(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } }); } } 

luego arrastre esta clase a su jframe, y ya está hecho

está en desuso, pero funciona .........

Tienes que descargar el tarro llamado rs2xml haciendo clic en este enlace rs2xml.jar. Luego agrégalo a tus bibliotecas de proyectos y luego importa

 import net.proteanit.sql.DbUtils; 

Preparo solo un método para hacerlo como muestra

 private void Update_table(){ try{ // fetch a connection connection = your_connection_class_name_here.getInstance().getConnection(); if (connection != null) { String sql="select name,description from sell_mode"; pst=connection.prepareStatement(sql); rs=pst.executeQuery(); your_table_name_for_populating_your_Data.setModel(DbUtils.resultSetToTableModel(rs)); } } catch(IOException | SQLException | PropertyVetoException e){ JOptionPane.showMessageDialog(null,e); } finally { if (rs!= null) try { rs.close(); } catch (SQLException e) {} if (pst != null) try { pst.close(); } catch (SQLException e) {} if (connection != null) try { connection.close(); } catch (SQLException e) {} } } 

Espero que esto ayude más

Con todos los factores puestos en consideración, con respecto a la architecture del código, el uso de progtwigción modular funcionaría muy bien y con más simplicidad en el código. Escribe un simple

 getData() function @returns a 2D array of the data from the database. 

pase esta función al constructor del constructor JTabel (), es decir,

 JTabel myTable = new JTable(getData(),columnsArray); 

En este caso, el segundo argumento: columnsArray es una única matriz dimensional que tiene los nombres de las columnas

 String[] columns = {{"ID","DataOfBirth","Age","Grade","Marks","RegNumber"}}; 

pasa el objeto JTable a un JScrollPane y luego terminas, justo después de agregar el ScrollPane al contenedor por supuesto

 JScrollPane scrollPane = new JScrollPane(myTable); JFrame myFrame = new JFrame(); myFrame.add(scrollPane); 

Aquí hay una función de muestra getData () que consulta la base de datos para los datos que luego se pasan a JTable

 public String[][] getRecords() { try (Connection conect = DriverManager.getConnection("jdbc:mysql://localhost:3306/online_students_registration", "root", "")) { Statement stm = conect.createStatement(); String SELECT_QUERY = "SELECT COUNT(*) FROM medicalrecords ;"; ResultSet cursor = stm.executeQuery(SELECT_QUERY); while (cursor.next()) { rows = cursor.getInt("COUNT(*)"); System.out.println("Table will have " + rows + " Rows"); } System.err.println("Contacts row count is obtained!!"); if (rows < 1) { JOptionPane.showMessageDialog(null, "There is NO DATA"); //contactsRowsCount = 1; //System.out.println("Table rows succefully reset to " + contactsRowsCount + " Rows"); dataValues = new String[1][8]; //dataValues[1][5] = "No Values"; for (int i = 0; i < 1; i++) { for (int j = 0; j < 8; j++) { if (j == 0) { dataValues[i][j] = "No Details Available"; System.out.println("" + dataValues); } else { dataValues[i][j] = "..."; System.out.println("Contacts" + dataValues[i][j]); } } } System.out.println("Return statement is being executed on 0 rows "); //return doctoredDataValues; } else if (rows > 0) { System.out.println("obtain contacts code is being run under " + rows + " Rows"); dataValues = new String[rows][8]; //declare array for contacts table data System.out.println("[ Line 1584 ]The dataValues object for the JTable succefully set"); String SELECT_QUERY_CONTACT = "SELECT * FROM medicalrecords; "; //OBTAIN CONTACTS FROM DB WITH REGARD TO CONTACT CATEGORY SPECIFIED ResultSet contactsTableCursor = stm.executeQuery(SELECT_QUERY_CONTACT); //use iterator-algorithm to insert values into the JTable for (int i = 0; contactsTableCursor.next() && i < rows; i++) { for (int j = 0; j < 8; j++) { dataValues[i][j] = contactsTableCursor.getString(j + 1); System.out.println("Contacts" + dataValues[i][j]); } } } JOptionPane.showMessageDialog(null, "Medical Details Added Succefully!!"); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "Unable to Obtain contacts:Server is Offline(LINE 1568)" + e.getMessage()); } return dataValues; } 
    Intereting Posts