Java JTable связывание через JPA - PullRequest
3 голосов
/ 03 марта 2011

Я пытался найти правильные ответы, но пока мне ничего не помогало. Я довольно новичок в программировании на Java с графическим интерфейсом, на самом деле, к самой Java. Однако у меня есть менеджеры, которые понимают JPA, как извлекать, вставлять и удалять с помощью JPA.

Теперь я хочу, чтобы данные в моей базе данных отображались в JTable.

В настоящее время у меня есть следующая таблица mySQL (которую я хочу показать в JTable

игры Id PK int заглавие издатель Жанр 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;
}

}

Я знаю, что это много кода для простого поста, но я действительно не знаю, как еще показать текущую проблему. Любые хорошие ссылки помогут или посоветуют сами по себе.

Спасибо, что нашли время, чтобы прочитать код и, возможно, помочь мне.

Помните, я всего лишь студент-программист, поэтому мне нужно многое узнать о конвенциях и т.д. Так что указатели также приветствуются, так как мне не терпится поучиться у более опытных разработчиков.

Ответы [ 2 ]

5 голосов
/ 03 марта 2011

Самый простой вариант выглядит примерно так:

@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 сначала в другом потоке.Это предотвратит зависание потока пользовательского интерфейса во время доступа к базе данных.

2 голосов
/ 03 марта 2011

Передача загруженного списка в модель с помощью параметра конструктора или метода установки.Тогда вы можете использовать следующую структуру модели:

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