Most simple code to populate JTable from ResultSet

前端 未结 10 977
慢半拍i
慢半拍i 2020-11-22 11:22

I googled the whole day and no luck. I call getnPrintAllData() method after pressing OK button. So the code is:

public class DatabaseSQLiteConne         


        
10条回答
  •  迷失自我
    2020-11-22 11:55

    Class Row will handle one row from your database.

    Complete implementation of UpdateTask responsible for filling up UI.

    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();
        }
    }
    

    Table Model:

    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;
        }
    }
    

    Main Application which builds UI and does the database connection

    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();
            }
        }
    }
    

提交回复
热议问题