我整天用谷歌搜索,没有运气。我getnPrintAllData()按确定按钮后调用方法。所以代码是:
getnPrintAllData()
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(); } } }
我的testResultSet()方法工作正常。现在,如何改变我的代码,以便它工作,或者什么是最简单的代码,以使DefaultTableModel从ResultSet?提前致谢。
编辑:我正在接收java.lang.IllegalStateException: SQLite JDBC: inconsistent internal state错误。
我认为从的实例构建模型的最简单方法ResultSet如下。
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)); } 方法buildTableModel: public static DefaultTableModel buildTableModel(ResultSet rs) throws SQLException { ResultSetMetaData metaData = rs.getMetaData(); // names of columns Vector<String> columnNames = new Vector<String>(); int columnCount = metaData.getColumnCount(); for (int column = 1; column <= columnCount; column++) { columnNames.add(metaData.getColumnName(column)); } // data of the table Vector<Vector<Object>> data = new Vector<Vector<Object>>(); while (rs.next()) { Vector<Object> vector = new Vector<Object>(); for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { vector.add(rs.getObject(columnIndex)); } data.add(vector); } return new DefaultTableModel(data, columnNames); }
更新
你喜欢用javax.swing.SwingWorker吗?你喜欢使用该try-with-resources语句吗?
javax.swing.SwingWorker
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<Void, Void>() { @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<String> columnNames = new Vector<String>(); int columnCount = metaData.getColumnCount(); for (int i = 1; i <= columnCount; i++) { columnNames.add(metaData.getColumnName(i)); } // Data of the table Vector<Vector<Object>> data = new Vector<Vector<Object>>(); while (rs.next()) { Vector<Object> vector = new Vector<Object>(); 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"); } }