2011-03-03 69 views
3

结合我试图寻找正确的答案,但没有任何帮助我至今。我对java的GUI编程颇为陌生,实际上,对于java本身来说。我有经理理解JPA,如何使用JPA检索,插入和删除。的Java JTable中通过JPA

现在我想在一个JTable中显示在我的数据库中的数据。

目前,我有以下MySQL表(我想JTable中显示

游戏 编号PK诠释 标题 出版商 类型 RELEASEDATE

至于编码的担忧,我已经成功地使用以下方式检索表中包含的数据:

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; 
} 

This succesfully retu列出我可以迭代的游戏列表。

然后,在我看来,我有以下

 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); 

这ofcourse使我们的表格模型,这就是我卡住了。

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; 
} 

}

我知道这是一个很大的代码,一个简单的职位,但我真的不知道怎么回事,以显示当前的问题。任何良好的联系都会有所帮助,或者独立提供建议。

感谢您抽出时间阅读代码,并可能帮助我。

记住,我只是一个学生的编程,所以我有很多东西需要学习有关公约等以及。所以也欢迎指针,因为我渴望向更有经验的开发人员学习。

回答

5

最简单的方法是这样的:

@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; 
} 

那可容易维护的问题,由于所有的幻数 - 一个解决办法是使用一个枚举列:

enum GameTableColumn { 
    ID, TITLE, PUBLISHER, GENRE, RELEASE_DATE; 
} 

然后使用GameTableColumn.values()[columnIndex]获取列的枚举实例。

一些风格笔记 - tblGamesModel是一个Java类非标准名称,类名总是以一个大写字母开头。更多的Java名称将是GamesTableModel。通常不鼓励匈牙利语记法前缀(例如“tbl”)。

而且具有数据库获取在构造函数通常是一个坏主意。在Swing应用程序中,您希望所有提取都是明确的,以确保它们不会阻止用户界面。而不是getGames()我会建议retrieveGames()。最好在表模型之外构造GamesRepository并将其传递给构造函数。然后,您可以先在另一个线程中执行JPA查询。这将防止UI线程在数据库访问正在进行时被冻结。

+0

非常感谢你拉斯海沃德,你的答案确实很精彩。我已经改变了你所建议的所有内容,而且你说得对,我用于表模型的命名约定看起来有点不合适。至于多线程查询,谢谢。我甚至没想过冻结我的用户界面。这个问题现在也解决了。我唯一不明白的是枚举部分。开关是否在列表<>中为所有对象计数?还有一个问题,我如何从列表中排除该ID?我不能在查询中使用它,因为我想稍后检索ID。再次感谢。 :) – 2011-03-03 09:32:44

+0

啊..对不起..我忽略了交换机中的getId。对不起,这个愚蠢的问题。想通了,它的工作。今晚我可以安全入睡!谢谢。 – 2011-03-03 09:42:44

2

通过构造函数参数或setter方法将加载列表传递给模型。然后你可以使用下面的模型结构:

public class TblGamesModel extends AbstractTableModel { 

    private static final String[] COLUMNS = {"id", "title", 
    ........... 
    private static final int COL_ID = 0; 
    private static final int COL_TITLE = 1; 

    private List<Game> list; //list that is injected via constructor or setter method 

    public int getRowCount() { 
     return list.size(); 
    } 

    public int getColumnCount() { 
     return COLUMNS.length; 
    } 

    public Object getValueAt(int rowIndex, int columnIndex) { 
     Game game = list.get(rowIndex); 
     switch (columnIndex) { 
      case COL_ID: 
       return game.getId(); 
      ........ 
     } 
    } 

    public String getColumnName(int column) { 
     return COLUMNS[column]; 
    } 
+0

谢谢您花时间回答。有了这个评论和上面的评论,我已经得到了一些工作。再次感谢:) – 2011-03-03 09:26:46

+0

所以,我的数据加载正确,现在一切都看起来很好,除了在切换中,返回game.genre的情况是一对多的关系,即许多游戏可能只有一个流派,并且每个流派都可以有一个或多个游戏。如何选择流派表中包含2列的流派名称,编号和名称 – 2011-03-03 12:34:40

+0

如果每个游戏只能有一个流派,那么它在游戏流派(游戏M --- 1)之间是多对一的类型)。默认情况下,这些关系在JPA中被热切地获取,所以你应该可以做一些像'game.getGenre()。getName()'这样的事情。你不是吗? – n0weak 2011-03-03 14:23:17