Доброго времени суток, дорогие форумчане. Изучая Java при работе с БД столкнулся с проблемой:
Текст ошибки:
Код:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at kurs.DatabaseTableModel.getValueAt(DatabaseTableModel.java:29)
at javax.swing.JTable.getValueAt(JTable.java:2717)
at javax.swing.JTable.prepareRenderer(JTable.java:5706)
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114)
При этом данные возвращаются корректно и заносятся в таблицу.
Ниже коды классов:
Код:
package kurs;
/*****************************
* @author Sergey Kazimirskiy
* @version 1.0.0
* Модуль подключения к базе данных
*****************************/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Database {
private final String URL;
private final String USER;
private final String PASSWORD;
private static Connection con;
private static Statement stmt;
private static ResultSet rs;
public Database() {
this.URL = "jdbc:mysql://localhost:3306/spp";
this.USER = "root";
this.PASSWORD = "";
}
public void getConnection(){
try {
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Database.con = DriverManager.getConnection(this.URL,this.USER, this.PASSWORD);
}
catch (SQLException sqlEx) {
System.out.println(sqlEx.getErrorCode());
}
}
public Statement createStatement() throws SQLException {
try{
stmt = con.createStatement();
}
catch(SQLException ex){
System.out.println(ex.getErrorCode());
}
finally{
return stmt;
}
}
public void closeConnection(){
try {
con.close();
}
catch(SQLException se) {
System.out.println(se.getErrorCode());
}
try {
stmt.close();
}
catch(SQLException se) {
System.out.println(se.getErrorCode());
}
}
}
Код:
package kurs;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class DatabaseTableModel extends AbstractTableModel{
private static final long serialVersionUID = 1L;
private final ArrayList<String> columnNames = new ArrayList<>();
private final ArrayList<Class> columnTypes = new ArrayList<>();
private final ArrayList<ArrayList<Object>> data = new ArrayList<>();
public int getColumnCount() {
synchronized (data) {
return columnNames.size();
}
}
public int getRowCount() {
return columnNames.size();
}
public Object getValueAt(int row, int col) {
//synchronized (data) {
return data.get(row).get(col);
//}
}
public String getColumnName(int col) {
return columnNames.get(col);
}
public Class getColumnClass(int col) {
return columnTypes.get(col);
}
public boolean isCellEditable(int row, int col) {
return true;
}
public void setValueAt(Object obj, int row, int col) {
synchronized (data) {
data.get(row).set(col, obj);
}
}
public void setDataSource(ResultSet rs) throws SQLException, ClassNotFoundException {
ResultSetMetaData rsmd = rs.getMetaData();
columnNames.clear();
columnTypes.clear();
data.clear();
int columnCount = rsmd.getColumnCount();
for (int i = 0; i < columnCount; i++) {
columnNames.add(rsmd.getColumnName(i + 1));
Class type = Class.forName(rsmd.getColumnClassName(i + 1));
columnTypes.add(type);
}
fireTableStructureChanged();
while (rs.next()) {
ArrayList rowData = new ArrayList();
for (int i = 0; i < columnCount; i++) {
if (columnTypes.get(i) == String.class)
rowData.add(rs.getString(i + 1));
else
rowData.add(rs.getObject(i + 1));
}
synchronized (data) {
data.add(rowData);
this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
}
}
}
}
Код:
package kurs;
import java.awt.BorderLayout;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class Main
{
public static void main(String[] args)
{
String query = "SELECT * FROM USers";
try{
Database con = new Database();
con.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
DatabaseTableModel model = new DatabaseTableModel();
model.setDataSource(rs);
JTable table = new JTable(model);
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JScrollPane(table), BorderLayout.CENTER);
JFrame frame = new JFrame("Database Table Model");
frame.setLocationRelativeTo(null);
frame.setSize(500, 400);
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}