2011-03-03 57 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