通过 JPA 绑定(bind) Java JTable

标签 java swing jpa jtable populate

我试图寻找合适的答案,但到目前为止没有任何帮助。我对 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/

相关文章:

java - 检查 Gprs 连接

java - 当底层数据库发生更改时通知应用程序(C++ 或 Java)的最佳方式是什么?

java - 使用 Java Swing 优化窗口大小

java - JPA id 生成通用策略

java - 在分离之前用 JPA 完全加载实体?

java - XUGGLE 错误 : Exception in thread "main" java. lang.NoClassDefFoundError: org/slf4j/LoggerFactory

java - 如何检查执行器何时完成运行特定的 Runnable

java - JXTreeTable 上的固定列

java - 将文本文件加载到 jTable 中

java - Hibernate 和 JPA 之间有什么区别?