3

私は適切な答えを探しようとしましたが、今のところ何も役に立ちませんでした。私はJavaGUIプログラミング、実際にはJava自体にまったく慣れていません。しかし、JPA、JPAを使用して取得、挿入、および削除する方法を理解するマネージャーがいます。

ここで、データベース内のデータをJTableに表示したいと思います。

私は現在、次のmySQLテーブルを持っています(これをJTableに表示したい

ゲームIDPKintタイトルパブリッシャージャンル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;
}

これにより、トラフを反復できるゲームのリストが正常に返されます。

次に、私の見解では、私は次のようになります

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

}

これは単純な投稿のコードがたくさんあることは知っていますが、現在の問題を他にどのように表示するかは本当にわかりません。良いリンクは、それ自体で役立つか、アドバイスします。

コードを読んで、おそらく私を助けてくれてありがとう。

私は単なる学生プログラミングなので、コンベンションなどについても学ぶことがたくさんあります。ですから、私はより経験豊富な開発者から学びたいと思っているので、ポインタも歓迎します。

4

2 に答える 2

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アプリケーションでは、すべてのフェッチを明示的にして、UIをブロックしないようにする必要があります。getGames()ではなく、retrieveGames()をお勧めします。テーブルモデルの外部でGamesRepositoryを構築し、コンストラクターに渡すのが最善の場合があります。次に、最初に別のスレッドでJPAクエリを実行できます。これにより、データベースアクセスの進行中にUIスレッドがフリーズするのを防ぐことができます。

于 2011-03-03T09:04:33.920 に答える
2

ロードされたリストをコンストラクターパラメーターまたはセッターメソッドを介してモデルに渡します。次に、次のモデル構造を使用できます。

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];
    }
于 2011-03-03T09:10:46.753 に答える