无法解析JTable构造方法:ArrayList参数传入报错求助
问题描述
我编写了如下Rentals类:
public class Rentals { protected int RentalID; protected int CustomerID; protected int MovieID; protected Date DateRented; protected Date DateDue; public Rentals(int rentalID, int customerID, int movieID, Date dateRented, Date dateDue) { RentalID = rentalID; CustomerID = customerID; MovieID = movieID; DateRented = dateRented; DateDue = dateDue; } public int getRentalID() { return RentalID; } public void setRentalID(int rentalID) { RentalID = rentalID; } public int getCustomerID() { return CustomerID; } public void setCustomerID(int customerID) { CustomerID = customerID; } public int getMovieID() { return MovieID; } public void setMovieID(int movieID) { MovieID = movieID; } public Date getDateRented() { return DateRented; } public void setDateRented(Date dateRented) { DateRented = dateRented; } public Date getDateDue() { return DateDue; } public void setDateDue(Date dateDue) { DateDue = dateDue; } }
在Main类中,我创建了两个ArrayList:存储Rentals对象的RentalList和存储列名的Columns,还定义了JTable对象Display。随后连接MS Azure SQL数据库,将查询数据存入这两个集合。尝试用这两个集合实例化Display时,出现如下错误:
java: no suitable constructor found for JTable(java.util.ArrayList<com.company.Rentals>,java.util.ArrayList<java.lang.String>) constructor javax.swing.JTable.JTable(javax.swing.table.TableModel,javax.swing.table.TableColumnModel) is not applicable (argument mismatch; java.util.ArrayList<com.company.Rentals> cannot be converted to javax.swing.table.TableModel) constructor javax.swing.JTable.JTable(int,int) is not applicable (argument mismatch; java.util.ArrayList<com.company.Rentals> cannot be converted to int) constructor javax.swing.JTable.JTable(java.util.Vector,java.util.Vector) is not applicable (argument mismatch; java.util.ArrayList<com.company.Rentals> cannot be converted to java.util.Vector) constructor javax.swing.JTable.JTable(java.lang.Object[][],java.lang.Object[]) is not applicable (argument mismatch; java.util.ArrayList<com.company.Rentals> cannot be converted to java.lang.Object[][])
报错代码行:Display = new JTable(RentalList, Columns);
Main类代码:
public class Main { public static JTable Display; public static ArrayList<Rentals> RentalList = new ArrayList<Rentals>(); public static ArrayList<String> Columns = new ArrayList<String>(); public static void main(String[] args) { String ConnectionURL = "___"; //HIDDEN, IN THE ACTUAL CODE IT DOES CONNECT ResultSet rs; // Open a connection try(Connection conn = DriverManager.getConnection(ConnectionURL); Statement stmt = conn.createStatement(); ) { rs = stmt.executeQuery("SELECT * FROM [dbo].[Rentals]"); while (rs.next()) { Rentals rental = new Rentals(0, 0, 0, null, null); rental.setRentalID(rs.getInt(1)); rental.setCustomerID(rs.getInt(2)); rental.setMovieID(rs.getInt(3)); rental.setDateRented(rs.getDate(4)); rental.setDateDue(rs.getDate(5)); RentalList.add(rental); } rs = stmt.executeQuery("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'Rentals'"); while (rs.next()) { Columns.add(rs.getString(1)); } } catch (SQLException e) { e.printStackTrace(); } Display = new JTable(RentalList, Columns); } }
我尝试改成Display = new JTable(RentalList.toString(), Columns);但错误依旧。请问我哪里操作有误?如何修正这个问题?
问题原因与解决方法
错误原因
JTable没有直接接收ArrayList<Rentals>和ArrayList<String>的构造方法。从报错信息可知,JTable仅支持以下几种参数类型的构造方法:
TableModel+TableColumnModel- 行列数量(int类型)
Vector+VectorObject[][]+Object[]
传入的ArrayList<Rentals>是自定义对象集合,JTable无法直接解析其中的属性作为表格行数据;调用toString()也无效,因为这只是将集合转为字符串,依然不符合构造方法的参数要求。
修正方案
方案1:转换为Object[][]和Object[]格式
将RentalList中的每个Rentals对象拆分为一维数组,再组合成二维数组,列名转换为Object[]类型:
// 转换行数据为二维数组 Object[][] rowData = new Object[RentalList.size()][5]; for (int i = 0; i < RentalList.size(); i++) { Rentals rental = RentalList.get(i); rowData[i][0] = rental.getRentalID(); rowData[i][1] = rental.getCustomerID(); rowData[i][2] = rental.getMovieID(); rowData[i][3] = rental.getDateRented(); rowData[i][4] = rental.getDateDue(); } // 转换列名为Object数组 Object[] columnNames = Columns.toArray(new Object[Columns.size()]); // 实例化JTable Display = new JTable(rowData, columnNames);
方案2:自定义TableModel(推荐)
继承AbstractTableModel,将RentalList和Columns作为数据源,重写必要方法。这种方式实现数据与视图分离,后续维护和扩展更方便:
import javax.swing.table.AbstractTableModel; import java.util.ArrayList; public class RentalTableModel extends AbstractTableModel { private ArrayList<Rentals> rentalList; private ArrayList<String> columnNames; public RentalTableModel(ArrayList<Rentals> rentalList, ArrayList<String> columnNames) { this.rentalList = rentalList; this.columnNames = columnNames; } @Override public int getRowCount() { return rentalList.size(); } @Override public int getColumnCount() { return columnNames.size(); } @Override public String getColumnName(int column) { return columnNames.get(column); } @Override public Object getValueAt(int rowIndex, int columnIndex) { Rentals rental = rentalList.get(rowIndex); switch (columnIndex) { case 0: return rental.getRentalID(); case 1: return rental.getCustomerID(); case 2: return rental.getMovieID(); case 3: return rental.getDateRented(); case 4: return rental.getDateDue(); default: return null; } } }
在Main类中使用自定义模型实例化JTable:
// 创建自定义TableModel RentalTableModel model = new RentalTableModel(RentalList, Columns); // 实例化JTable Display = new JTable(model);
方案对比
- 方案1适合简单场景,但如果
Rentals类属性变更,需要手动修改数组转换逻辑; - 方案2遵循MVC设计思想,代码可维护性更强,是Swing开发中的标准做法。
内容的提问来源于stack exchange,提问作者Slappy
相关产品推荐
相关产品推荐

