我试图寻找合适的答案,但到目前为止没有任何帮助。我对 Java GUI 编程很陌生,实际上,对 Java 本身。但是我有经理了解 JPA,如何使用 JPA 检索、插入和删除。
现在我希望我的数据库中的数据显示在 JTable 中。
我目前有以下 mySQL 表(我想在 JTable 中显示它
游戏 ID PK 整数 标题 出版商 类型 发布日期
就编码问题而言,我已使用以下方法成功检索到表中包含的数据:
public List<Game> getGames(){
List<Game> games;
try{
TypedQuery<Game> selectGamesQuery = entityManager.createQuery("SELECT g FROM Game g", Game.class);
games = selectGamesQuery.getResultList();
} catch(Exception e) {
System.out.println(e);
}
return games;
}
这会成功返回我可以迭代的游戏列表。
那么,在我看来我有以下几点
JScrollPane scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
tblGames = new JTable(new tblGamesModel());
tblGames.setShowVerticalLines(true);
tblGames.setShowHorizontalLines(true);
tblGames.setFillsViewportHeight(true);
scrollPane.setViewportView(tblGames);
这当然会把我们引向表格模型,这就是我遇到的问题。
public class tblGamesModel extends AbstractTableModel {
private GameRepository gameRepository;
private List<Game> games;
/**
*
*/
public tblGamesModel(){
gameRepository = new GameRepository();
games = gameRepository.getGames();
}
private static final long serialVersionUID = 1L;
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return games.size();
}
@Override
public Object getValueAt(int arg0, int arg1) {
// TODO Auto-generated method stub
return null;
}
我知道这是一个简单的帖子的大量代码,但我真的不知道如何显示当前的问题。任何好的链接都会有所帮助,或自行提出建议。
感谢您花时间阅读代码并可能帮助我。
请记住,我只是一名学生编程,所以我还有很多关于约定等方面的知识。因此,也欢迎指点,因为我渴望向更有经验的开发人员学习。
最佳答案
最简单的选择是这样的:
@Override
public int getColumnCount() {
return 5;
}
...
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Game game = games.get(rowIndex);
switch (columnIndex) {
case 0:
return game.getId();
case 1:
return game.getTitle();
case 2:
return game.getPublisher();
case 3:
return game.getGenre();
case 4:
return game.getReleaseDate();
}
return null;
}
由于所有魔数(Magic Number),这可能容易出现维护问题 - 一种解决方案是对列使用枚举:
enum GameTableColumn {
ID, TITLE, PUBLISHER, GENRE, RELEASE_DATE;
}
然后使用 GameTableColumn.values()[columnIndex] 获取列的枚举实例。
一些样式说明 - tblGamesModel 是 Java 类的非标准名称,类名始终以大写字母开头。一个更 Java 的名称是 GamesTableModel。通常不鼓励使用匈牙利符号前缀(例如“tbl”)。
在构造函数中获取数据库通常不是一个好主意。在 Swing 应用程序中,您希望所有提取都是显式的,这样您就可以确保它们不会阻塞 UI。我建议使用 retrieveGames() 而不是 getGames()。最好在表模型之外构造 GamesRepository 并将其传递给构造函数。然后您可以先在不同的线程中执行 JPA 查询。这将防止 UI 线程在数据库访问过程中卡住。
关于通过 JPA 绑定(bind) Java JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178339/