我正在构建一个电影数据库 GUI 应用程序,我需要将包含所有电影信息的数组列表转换为二维数组,以便 JTable 接受它。
它确实转换了它,但是当在 Eclipse 调试中浏览该程序时,我注意到 for 循环算法将第一个电影记录写入数组内的所有空间。
例如 [电影 1 标题、电影 1 评级、电影 1 类型][电影 1 标题、电影 1 评级、电影 1 类型] 代替 [电影 1 标题、电影 1 评级、电影 1 类型][2 标题、2 评级、2 类型]
然后,当数据库中的第二个电影记录的循环中断时,它会用第二个记录覆盖第一个电影记录,依此类推。
在该过程结束时,GUI 显示相同记录的长列表,即列表中的最后一条记录。
我不确定我的循环逻辑哪里出了问题。谁能告诉我正确的方向吗?
FilmDatabase filmList = new FilmDatabase();
filmList = filmList.listInput("MainDBTest.txt");
int listLen = filmList.getFilmDB().size();
Object[][] filmTable = new Object[listLen][5];
for (int x = 0; x < listLen; x++) {
for(Film film : filmList.getFilmDB()) {
//System.out.println(film);
filmTable[x][0] = film.getFilmName();
filmTable[x][1] = film.getFilmRating();
filmTable[x][2] = film.getReleaseDate();
filmTable[x][3] = film.getFilmGenre();
filmTable[x][4] = film.getFilmCast();
System.out.println(film);
}
}
Object columnNames[] = { "Title", "Rating", "Year", "Genre", "Cast" };
JTable mainTable = new JTable(filmTable, columnNames);
最佳答案
I need to convert the arraylist with all the Film information into a 2d array so it'll be accepted by JTable.
您不需要二维数组。事实上你不想这样做。
DefaultTableModel
将数据存储在 vector 的 vector 中。二维数组中的数据将被复制到 vector 的 vector 中。因此,使用您的方法,您将拥有 3 个数据副本:
- 在你的ArrayList中
- 在临时二维数组中
- 在 vector 的 vector 中。
因此,如果您确实想使用这种方法,至少您应该直接将数据复制到 Vector 并跳过 2D 数组。所以代码会是这样的:
Object columnNames[] = { "Title", "Rating", "Year", "Genre", "Cast" };
DefaultTableModel model = new DefaultTableModel(columnNames, 0);
for(Film film : filmList.getFilmDB())
{
Vector<Object> row = new Vector<Object>(5)
row.addElement( film.getFilmName() );
row.addElement( film.getFilmRating() );
...
model.addRow( row );
}
JTable mainTable = new JTable(model);
或者更好的解决方案是创建一个自定义 FilmTableModel
来直接保存所有 Film 对象。
有关此方法的分步示例,请查看 Row Table Model 中的示例。 .
关于java - foreach 和 for 循环将重复记录复制到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46751450/